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

taosdata / TDengine / #4473

08 Jul 2025 09:38AM UTC coverage: 62.922% (+0.7%) from 62.22%
#4473

push

travis-ci

web-flow
Merge pull request #31712 from taosdata/merge/mainto3.0

merge: from main to 3.0 branch

158525 of 321496 branches covered (49.31%)

Branch coverage included in aggregate %.

56 of 60 new or added lines in 13 files covered. (93.33%)

1333 existing lines in 67 files now uncovered.

245526 of 320647 relevant lines covered (76.57%)

17689640.25 hits per line

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

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

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

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

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

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

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

106
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STB, mndRetrieveStb);
2,491✔
107
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_STB, mndCancelGetNextStb);
2,491✔
108

109
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_COL, mndRetrieveStbCol);
2,491✔
110
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_COL, mndCancelGetNextStb);
2,491✔
111

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

115
void mndCleanupStb(SMnode *pMnode) {}
2,490✔
116

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

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

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

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

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

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

176
  if (pStb->commentLen > 0) {
45,671✔
177
    SDB_SET_BINARY(pRaw, dataPos, pStb->comment, pStb->commentLen + 1, _OVER)
220!
178
  }
179

180
  if (pStb->ast1Len > 0) {
45,671✔
181
    SDB_SET_BINARY(pRaw, dataPos, pStb->pAst1, pStb->ast1Len, _OVER)
16!
182
  }
183

184
  if (pStb->ast2Len > 0) {
45,671✔
185
    SDB_SET_BINARY(pRaw, dataPos, pStb->pAst2, pStb->ast2Len, _OVER)
16!
186
  }
187

188
  if (pStb->pCmpr != NULL) {
45,671!
189
    for (int i = 0; i < pStb->numOfColumns; i++) {
3,832,130✔
190
      SColCmpr *p = &pStb->pCmpr[i];
3,786,459✔
191
      SDB_SET_INT16(pRaw, dataPos, p->id, _OVER)
3,786,459!
192
      SDB_SET_INT32(pRaw, dataPos, p->alg, _OVER)
3,786,459!
193
    }
194
  }
195
  SDB_SET_INT64(pRaw, dataPos, pStb->keep, _OVER)
45,671!
196

197
  if (hasTypeMod) {
45,671✔
198
    for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
2,872,519✔
199
      SDB_SET_INT32(pRaw, dataPos, pStb->pExtSchemas[i].typeMod, _OVER);
2,864,883!
200
    }
201
  }
202

203
  SDB_SET_INT8(pRaw, dataPos, pStb->virtualStb, _OVER)
45,671!
204
  SDB_SET_RESERVE(pRaw, dataPos, STB_RESERVE_SIZE, _OVER)
45,671!
205
  SDB_SET_DATALEN(pRaw, dataPos, _OVER)
45,671!
206

207
  terrno = 0;
45,671✔
208

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

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

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

228
  int8_t sver = 0;
42,011✔
229
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
42,011!
230

231
  if (sver > STB_VER_NUMBER) {
42,011!
232
    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
×
233
    goto _OVER;
×
234
  }
235

236
  pRow = sdbAllocRow(sizeof(SStbObj));
42,011✔
237
  if (pRow == NULL) goto _OVER;
42,011!
238

239
  pStb = sdbGetRowObj(pRow);
42,011✔
240
  if (pStb == NULL) goto _OVER;
42,011!
241

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

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

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

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

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

297
  if (pStb->commentLen > 0) {
42,011✔
298
    pStb->comment = taosMemoryCalloc(pStb->commentLen + 1, 1);
192!
299
    if (pStb->comment == NULL) goto _OVER;
192!
300
    SDB_GET_BINARY(pRaw, dataPos, pStb->comment, pStb->commentLen + 1, _OVER)
192!
301
  }
302

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

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

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

334
  // type mod
335
  if (hasExtSchemas) {
42,011✔
336
    pStb->pExtSchemas = taosMemoryCalloc(pStb->numOfColumns, sizeof(SExtSchema));
16,965!
337
    if (!pStb->pExtSchemas) goto _OVER;
16,965!
338
    for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
7,541,131✔
339
      SSchema *pSchema = &pStb->pColumns[i];
7,524,166✔
340
      SDB_GET_INT32(pRaw, dataPos, &pStb->pExtSchemas[i].typeMod, _OVER)
7,524,166!
341
    }
342
  }
343

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

350
  SDB_GET_RESERVE(pRaw, dataPos, STB_RESERVE_SIZE, _OVER)
42,011!
351

352
  terrno = 0;
42,011✔
353

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

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

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

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

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

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

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

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

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

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

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

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

485
  if (pNew->pExtSchemas) {
22,789✔
486
    taosMemoryFreeClear(pOld->pExtSchemas);
16,852!
487
    pOld->pExtSchemas = taosMemoryCalloc(pNew->numOfColumns, sizeof(SExtSchema));
16,852!
488
    if (pOld->pExtSchemas == NULL){
16,852!
489
      goto END;
×
490
    }
491
    memcpy(pOld->pExtSchemas, pNew->pExtSchemas, pNew->numOfColumns * sizeof(SExtSchema));
16,852✔
492
  }
493

494
END:
5,937✔
495
  taosWUnLockLatch(&pOld->lock);
22,789✔
496
  return terrno;
22,789✔
497
}
498

499
SStbObj *mndAcquireStb(SMnode *pMnode, char *stbName) {
1,556,816✔
500
  SSdb    *pSdb = pMnode->pSdb;
1,556,816✔
501
  SStbObj *pStb = sdbAcquire(pSdb, SDB_STB, stbName);
1,556,816✔
502
  if (pStb == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
1,556,840!
503
    terrno = TSDB_CODE_MND_STB_NOT_EXIST;
14,258✔
504
  }
505
  return pStb;
1,556,840✔
506
}
507

508
void mndReleaseStb(SMnode *pMnode, SStbObj *pStb) {
1,553,579✔
509
  SSdb *pSdb = pMnode->pSdb;
1,553,579✔
510
  sdbRelease(pSdb, pStb);
1,553,579✔
511
}
1,553,578✔
512

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

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

520
  return mndAcquireDb(pMnode, db);
20,512✔
521
}
522

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

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

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

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

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

568
  req.colCmpr.pColCmpr = taosMemoryCalloc(pCmpr->nCols, sizeof(SColCmpr));
36,708!
569
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
3,578,057✔
570
    SColCmpr *p = &pCmpr->pColCmpr[i];
3,541,349✔
571
    p->alg = pStb->pCmpr[i].alg;
3,541,349✔
572
    p->id = pStb->pCmpr[i].id;
3,541,349✔
573
  }
574

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

603
  contLen += sizeof(SMsgHead);
36,708✔
604

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

611
  pHead->contLen = htonl(contLen);
36,708✔
612
  pHead->vgId = htonl(pVgroup->vgId);
36,708✔
613

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

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

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

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

647
  req.name = (char *)tNameGetTableName(&name);
28,000✔
648
  req.suid = pStb->uid;
28,000✔
649

650
  tEncodeSize(tEncodeSVDropStbReq, &req, contLen, ret);
28,000!
651
  if (ret < 0) return NULL;
28,000!
652

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

660
  pHead->contLen = htonl(contLen);
28,000✔
661
  pHead->vgId = htonl(pVgroup->vgId);
28,000✔
662

663
  void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
28,000✔
664

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

673
  *pContLen = contLen;
28,000✔
674
  return pHead;
28,000✔
675
}
676

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

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

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

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

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

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

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

737
  TAOS_RETURN(code);
10,507✔
738
}
739

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

754
  TAOS_RETURN(code);
×
755
}
756

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

771
  TAOS_RETURN(code);
10,239✔
772
}
773

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

781
  while (1) {
81,282✔
782
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
91,521✔
783
    if (pIter == NULL) break;
91,521✔
784
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
81,282✔
785
      sdbRelease(pSdb, pVgroup);
56,160✔
786
      continue;
56,160✔
787
    }
788

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

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

815
  TAOS_RETURN(code);
10,239✔
816
}
817

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

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

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

844
  TAOS_RETURN(code);
2✔
845
}
846

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

853
  while (1) {
81,282✔
854
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
91,521✔
855
    if (pIter == NULL) break;
91,521✔
856
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
81,282✔
857
      sdbRelease(pSdb, pVgroup);
56,160✔
858
      continue;
56,160✔
859
    }
860

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

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

885
  TAOS_RETURN(code);
10,239✔
886
}
887

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

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

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

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

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

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

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

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

981
  for (int32_t i = 0; i < pDst->numOfTags; ++i) {
70,167✔
982
    SField  *pField = taosArrayGet(pCreate->pTags, i);
59,861✔
983
    SSchema *pSchema = &pDst->pTags[i];
59,861✔
984
    pSchema->type = pField->type;
59,861✔
985
    pSchema->bytes = pField->bytes;
59,861✔
986
    if (i == 0) {
59,861✔
987
      SSCHMEA_SET_IDX_ON(pSchema);
10,306✔
988
    }
989
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
59,861✔
990
    pSchema->colId = pDst->nextColId;
59,861✔
991
    pDst->nextColId++;
59,861✔
992
  }
993
  // set col compress
994
  pDst->pCmpr = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SCmprObj));
10,306!
995
  for (int32_t i = 0; i < pDst->numOfColumns; i++) {
294,021✔
996
    SFieldWithOptions *pField = taosArrayGet(pCreate->pColumns, i);
283,715✔
997
    SSchema           *pSchema = &pDst->pColumns[i];
283,715✔
998

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

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

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

1029
  char fullIdxName[TSDB_INDEX_FNAME_LEN * 2] = {0};
8,824✔
1030

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

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

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

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

1062
  TAOS_CHECK_GOTO(mndSetCreateIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
8,824!
1063

1064
  TAOS_CHECK_GOTO(mndAddStbToTrans(pMnode, pTrans, pDb, &stbObj), NULL, _OVER);
8,824✔
1065
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
8,757✔
1066
  code = 0;
8,755✔
1067

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

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

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

1093
  mDebug("start to process ttl timer");
7,446✔
1094

1095
  while (1) {
68,311✔
1096
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
75,757✔
1097
    if (pIter == NULL) break;
75,757✔
1098

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

1113
    SRpcMsg rpcMsg = {
68,311✔
1114
        .msgType = TDMT_VND_FETCH_TTL_EXPIRED_TBS, .pCont = pHead, .contLen = contLen, .info = pReq->info};
1115
    SEpSet epSet = mndGetVgroupEpset(pMnode, pVgroup);
68,311✔
1116
    code = tmsgSendReq(&epSet, &rpcMsg);
68,311✔
1117
    if (code != 0) {
68,311✔
1118
      mError("vgId:%d, failed to send drop ttl table request to vnode since 0x%x", pVgroup->vgId, code);
111!
1119
    } else {
1120
      mDebug("vgId:%d, send drop ttl table request to vnode, time:%" PRId32, pVgroup->vgId, ttlReq.timestampSec);
68,200✔
1121
    }
1122
    sdbRelease(pSdb, pVgroup);
68,311✔
1123
  }
1124

1125
  return 0;
7,446✔
1126
}
1127

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

1137
  while (1) {
99✔
1138
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
102✔
1139
    if (pIter == NULL) break;
102✔
1140

1141
    int32_t code = 0;
99✔
1142

1143
    SMsgHead *pHead = rpcMallocCont(contLen);
99✔
1144
    if (pHead == NULL) {
99!
1145
      sdbCancelFetch(pSdb, pVgroup);
×
1146
      sdbRelease(pSdb, pVgroup);
×
1147
      continue;
×
1148
    }
1149
    pHead->contLen = htonl(contLen);
99✔
1150
    pHead->vgId = htonl(pVgroup->vgId);
99✔
1151
    if ((code = tSerializeSVTrimDbReq((char *)pHead + sizeof(SMsgHead), reqLen, &trimReq)) < 0) {
99!
1152
      mError("vgId:%d, failed to serialize trim db request since %s", pVgroup->vgId, tstrerror(code));
×
1153
    }
1154

1155
    SRpcMsg rpcMsg = {.msgType = TDMT_VND_TRIM, .pCont = pHead, .contLen = contLen};
99✔
1156
    SEpSet  epSet = mndGetVgroupEpset(pMnode, pVgroup);
99✔
1157
    code = tmsgSendReq(&epSet, &rpcMsg);
99✔
1158
    if (code != 0) {
99!
1159
      mError("vgId:%d, timer failed to send vnode-trim request to vnode since 0x%x", pVgroup->vgId, code);
×
1160
    } else {
1161
      mInfo("vgId:%d, timer send vnode-trim request to vnode, time:%d", pVgroup->vgId, trimReq.timestamp);
99!
1162
    }
1163
    sdbRelease(pSdb, pVgroup);
99✔
1164
  }
1165

1166
  return 0;
3✔
1167
}
1168

1169
static int32_t mndProcessS3MigrateDbTimer(SRpcMsg *pReq) {
×
1170
  SMnode          *pMnode = pReq->info.node;
×
1171
  SSdb            *pSdb = pMnode->pSdb;
×
1172
  SVgObj          *pVgroup = NULL;
×
1173
  void            *pIter = NULL;
×
1174
  SVS3MigrateDbReq s3migrateReq = {.timestamp = taosGetTimestampSec()};
×
1175
  int32_t          reqLen = tSerializeSVS3MigrateDbReq(NULL, 0, &s3migrateReq);
×
1176
  int32_t          contLen = reqLen + sizeof(SMsgHead);
×
1177

1178
  while (1) {
×
1179
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
×
1180
    if (pIter == NULL) break;
×
1181

1182
    int32_t code = 0;
×
1183

1184
    SMsgHead *pHead = rpcMallocCont(contLen);
×
1185
    if (pHead == NULL) {
×
1186
      sdbRelease(pSdb, pVgroup);
×
1187
      continue;
×
1188
    }
1189
    pHead->contLen = htonl(contLen);
×
1190
    pHead->vgId = htonl(pVgroup->vgId);
×
1191
    if ((code = tSerializeSVS3MigrateDbReq((char *)pHead + sizeof(SMsgHead), reqLen, &s3migrateReq)) < 0) {
×
1192
      mError("vgId:%d, failed to serialize s3migrate db request since %s", pVgroup->vgId, tstrerror(code));
×
1193
      sdbRelease(pSdb, pVgroup);
×
1194
      continue;
×
1195
    }
1196

1197
    SRpcMsg rpcMsg = {.msgType = TDMT_VND_S3MIGRATE, .pCont = pHead, .contLen = contLen};
×
1198
    SEpSet  epSet = mndGetVgroupEpset(pMnode, pVgroup);
×
1199
    code = tmsgSendReq(&epSet, &rpcMsg);
×
1200
    if (code != 0) {
×
1201
      mError("vgId:%d, timer failed to send vnode-s3migrate request to vnode since 0x%x", pVgroup->vgId, code);
×
1202
    } else {
1203
      mInfo("vgId:%d, timer send vnode-s3migrate request to vnode, time:%d", pVgroup->vgId, s3migrateReq.timestamp);
×
1204
    }
1205
    sdbRelease(pSdb, pVgroup);
×
1206
  }
1207

1208
  return 0;
×
1209
}
1210

1211
static int32_t mndFindSuperTableTagIndex(const SStbObj *pStb, const char *tagName) {
5,786✔
1212
  for (int32_t tag = 0; tag < pStb->numOfTags; tag++) {
111,349✔
1213
    if (strcmp(pStb->pTags[tag].name, tagName) == 0) {
107,883✔
1214
      return tag;
2,320✔
1215
    }
1216
  }
1217

1218
  return -1;
3,466✔
1219
}
1220

1221
static int32_t mndFindSuperTableColumnIndex(const SStbObj *pStb, const char *colName) {
6,149✔
1222
  for (int32_t col = 0; col < pStb->numOfColumns; col++) {
1,189,350✔
1223
    if (strcmp(pStb->pColumns[col].name, colName) == 0) {
1,185,761✔
1224
      return col;
2,560✔
1225
    }
1226
  }
1227

1228
  return -1;
3,589✔
1229
}
1230

1231
static bool mndValidateSchema(SSchema *pSchemas, int32_t nSchema, SArray *pFields, int32_t maxLen) {
3,376✔
1232
  int32_t rowLen = 0;
3,376✔
1233
  for (int32_t i = 0; i < nSchema; ++i) {
577,952✔
1234
    rowLen += (pSchemas + i)->bytes;
574,576✔
1235
  }
1236

1237
  int32_t nField = taosArrayGetSize(pFields);
3,376✔
1238
  for (int32_t i = 0; i < nField; ++i) {
6,752✔
1239
    rowLen += ((SField *)TARRAY_GET_ELEM(pFields, i))->bytes;
3,376✔
1240
  }
1241

1242
  return rowLen <= maxLen;
3,376✔
1243
}
1244

1245
static int32_t mndBuildStbFromAlter(SStbObj *pStb, SStbObj *pDst, SMCreateStbReq *createReq) {
92✔
1246
  int32_t code = 0;
92✔
1247
  taosRLockLatch(&pStb->lock);
92✔
1248
  memcpy(pDst, pStb, sizeof(SStbObj));
92✔
1249
  taosRUnLockLatch(&pStb->lock);
92✔
1250

1251
  pDst->source = createReq->source;
92✔
1252
  pDst->updateTime = taosGetTimestampMs();
92✔
1253
  pDst->numOfColumns = createReq->numOfColumns;
92✔
1254
  pDst->numOfTags = createReq->numOfTags;
92✔
1255
  pDst->pColumns = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SSchema));
92!
1256
  pDst->pTags = taosMemoryCalloc(1, pDst->numOfTags * sizeof(SSchema));
92!
1257
  pDst->pCmpr = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SColCmpr));
92!
1258
  pDst->pExtSchemas = taosMemoryCalloc(pDst->numOfColumns, sizeof(SExtSchema));
92!
1259

1260
  if (pDst->pColumns == NULL || pDst->pTags == NULL || pDst->pCmpr == NULL || pDst->pExtSchemas == NULL) {
92!
1261
    code = terrno;
×
1262
    TAOS_RETURN(code);
×
1263
  }
1264

1265
  if (pDst->nextColId < 0 || pDst->nextColId >= 0x7fff - pDst->numOfColumns - pDst->numOfTags) {
92!
1266
    code = TSDB_CODE_OUT_OF_RANGE;
×
1267
    TAOS_RETURN(code);
×
1268
  }
1269

1270
  for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
690✔
1271
    SFieldWithOptions *pField = taosArrayGet(createReq->pColumns, i);
598✔
1272
    SSchema           *pSchema = &pDst->pColumns[i];
598✔
1273
    pSchema->type = pField->type;
598✔
1274
    pSchema->bytes = pField->bytes;
598✔
1275
    pSchema->flags = pField->flags;
598✔
1276
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
598✔
1277
    int32_t cIndex = mndFindSuperTableColumnIndex(pStb, pField->name);
598✔
1278
    if (cIndex >= 0) {
598✔
1279
      pSchema->colId = pStb->pColumns[cIndex].colId;
525✔
1280
    } else {
1281
      pSchema->colId = pDst->nextColId++;
73✔
1282
    }
1283
  }
1284

1285
  for (int32_t i = 0; i < pDst->numOfTags; ++i) {
634✔
1286
    SField  *pField = taosArrayGet(createReq->pTags, i);
542✔
1287
    SSchema *pSchema = &pDst->pTags[i];
542✔
1288
    pSchema->type = pField->type;
542✔
1289
    pSchema->bytes = pField->bytes;
542✔
1290
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
542✔
1291
    int32_t cIndex = mndFindSuperTableTagIndex(pStb, pField->name);
542✔
1292
    if (cIndex >= 0) {
542✔
1293
      pSchema->colId = pStb->pTags[cIndex].colId;
487✔
1294
    } else {
1295
      pSchema->colId = pDst->nextColId++;
55✔
1296
    }
1297
  }
1298
  for (int32_t i = 0; i < pDst->numOfColumns; i++) {
690✔
1299
    SColCmpr          *p = pDst->pCmpr + i;
598✔
1300
    SFieldWithOptions *pField = taosArrayGet(createReq->pColumns, i);
598✔
1301
    SSchema           *pSchema = &pDst->pColumns[i];
598✔
1302
    p->id = pSchema->colId;
598✔
1303
    if (pField->compress == 0) {
598!
1304
      p->alg = createDefaultColCmprByType(pSchema->type);
×
1305
    } else {
1306
      p->alg = pField->compress;
598✔
1307
    }
1308
    if (pField->flags & COL_HAS_TYPE_MOD) {
598✔
1309
      pDst->pExtSchemas[i].typeMod = pField->typeMod;
16✔
1310
    }
1311
  }
1312
  pDst->tagVer = createReq->tagVer;
92✔
1313
  pDst->colVer = createReq->colVer;
92✔
1314
  return TSDB_CODE_SUCCESS;
92✔
1315
}
1316

1317
static int32_t mndProcessCreateStbReq(SRpcMsg *pReq) {
9,025✔
1318
  SMnode        *pMnode = pReq->info.node;
9,025✔
1319
  int32_t        code = -1;
9,025✔
1320
  SStbObj       *pStb = NULL;
9,025✔
1321
  SDbObj        *pDb = NULL;
9,025✔
1322
  SMCreateStbReq createReq = {0};
9,025✔
1323
  bool           isAlter = false;
9,025✔
1324
  SHashObj      *pHash = NULL;
9,025✔
1325

1326
  if (tDeserializeSMCreateStbReq(pReq->pCont, pReq->contLen, &createReq) != 0) {
9,025!
1327
    code = TSDB_CODE_INVALID_MSG;
×
1328
    goto _OVER;
×
1329
  }
1330

1331
  mInfo("stb:%s, start to create", createReq.name);
9,025!
1332
  if (mndCheckCreateStbReq(&createReq) != 0) {
9,025!
1333
    code = TSDB_CODE_INVALID_MSG;
×
1334
    goto _OVER;
×
1335
  }
1336

1337
  pStb = mndAcquireStb(pMnode, createReq.name);
9,025✔
1338
  if (pStb != NULL) {
9,025✔
1339
    if (createReq.igExists) {
199✔
1340
      if (createReq.source == TD_REQ_FROM_APP) {
196✔
1341
        mInfo("stb:%s, already exist, ignore exist is set", createReq.name);
11!
1342
        code = 0;
11✔
1343
        goto _OVER;
11✔
1344
      } else if (pStb->uid != createReq.suid) {
185!
1345
        mInfo("stb:%s, alter table does not need to be done, because table is deleted", createReq.name);
×
1346
        code = 0;
×
1347
        goto _OVER;
×
1348
      } else if (createReq.tagVer > 0 || createReq.colVer > 0) {
277!
1349
        int32_t tagDelta = createReq.tagVer - pStb->tagVer;
185✔
1350
        int32_t colDelta = createReq.colVer - pStb->colVer;
185✔
1351
        mInfo("stb:%s, already exist while create, input tagVer:%d colVer:%d, exist tagVer:%d colVer:%d",
185!
1352
              createReq.name, createReq.tagVer, createReq.colVer, pStb->tagVer, pStb->colVer);
1353
        if (tagDelta <= 0 && colDelta <= 0) {
185✔
1354
          mInfo("stb:%s, schema version is not incremented and nothing needs to be done", createReq.name);
93!
1355
          code = 0;
93✔
1356
          goto _OVER;
93✔
1357
        } else if ((tagDelta == 1 && colDelta == 0) || (tagDelta == 0 && colDelta == 1) ||
92!
1358
                   (pStb->colVer == 1 && createReq.colVer > 1) || (pStb->tagVer == 1 && createReq.tagVer > 1)) {
×
1359
          isAlter = true;
92✔
1360
          mInfo("stb:%s, schema version is only increased by 1 number, do alter operation", createReq.name);
92!
1361
        } else {
1362
          mError("stb:%s, schema version increase more than 1 number, error is returned", createReq.name);
×
1363
          code = TSDB_CODE_MND_INVALID_SCHEMA_VER;
×
1364
          goto _OVER;
×
1365
        }
1366
      } else {
1367
        mError("stb:%s, already exist while create, input tagVer:%d colVer:%d is invalid, origin tagVer:%d colVer:%d",
×
1368
               createReq.name, createReq.tagVer, createReq.colVer, pStb->tagVer, pStb->colVer);
1369
        code = TSDB_CODE_MND_INVALID_SCHEMA_VER;
×
1370
        goto _OVER;
×
1371
      }
1372
    } else {
1373
      code = TSDB_CODE_MND_STB_ALREADY_EXIST;
3✔
1374
      goto _OVER;
3✔
1375
    }
1376
  } else if (terrno != TSDB_CODE_MND_STB_NOT_EXIST) {
8,826!
1377
    goto _OVER;
×
1378
  } else if ((createReq.source == TD_REQ_FROM_TAOX_OLD || createReq.source == TD_REQ_FROM_TAOX || createReq.source == TD_REQ_FROM_SML) &&
8,826!
1379
             (createReq.tagVer != 1 || createReq.colVer != 1)) {
47!
1380
    mInfo("stb:%s, alter table does not need to be done, because table is deleted", createReq.name);
1!
1381
    code = 0;
1✔
1382
    goto _OVER;
1✔
1383
  }
1384

1385
  pHash = taosHashInit(createReq.numOfColumns + createReq.numOfTags, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY),
8,917✔
1386
                       false, HASH_NO_LOCK);
1387
  if (pHash == NULL) {
8,917!
1388
    code = TSDB_CODE_OUT_OF_MEMORY;
×
1389
    goto _OVER;
×
1390
  }
1391

1392
  for (int32_t i = 0; i < createReq.numOfColumns; ++i) {
275,815✔
1393
    SFieldWithOptions *pField = taosArrayGet(createReq.pColumns, i);
266,898✔
1394
    if ((code = taosHashPut(pHash, pField->name, strlen(pField->name), NULL, 0)) != 0) {
266,898!
1395
      if (code == TSDB_CODE_DUP_KEY) {
×
1396
        code = TSDB_CODE_TSC_DUP_COL_NAMES;
×
1397
      }
1398
      goto _OVER;
×
1399
    }
1400
  }
1401

1402
  for (int32_t i = 0; i < createReq.numOfTags; ++i) {
67,225✔
1403
    SField *pField = taosArrayGet(createReq.pTags, i);
58,309✔
1404
    if ((code = taosHashPut(pHash, pField->name, strlen(pField->name), NULL, 0)) != 0) {
58,309✔
1405
      if (code == TSDB_CODE_DUP_KEY) {
1!
1406
        code = TSDB_CODE_TSC_DUP_COL_NAMES;
1✔
1407
      }
1408
      goto _OVER;
1✔
1409
    }
1410
  }
1411

1412
  pDb = mndAcquireDbByStb(pMnode, createReq.name);
8,916✔
1413
  if (pDb == NULL) {
8,916!
1414
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
1415
    goto _OVER;
×
1416
  }
1417

1418
  if ((code = mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_WRITE_DB, pDb)) != 0) {
8,916!
1419
    goto _OVER;
×
1420
  }
1421

1422
  int32_t numOfStbs = -1;
8,916✔
1423
  if ((code = mndGetNumOfStbs(pMnode, pDb->name, &numOfStbs)) != 0) {
8,916!
1424
    goto _OVER;
×
1425
  }
1426

1427
  if (pDb->cfg.numOfStables == 1 && numOfStbs != 0) {
8,916!
1428
    code = TSDB_CODE_MND_SINGLE_STB_MODE_DB;
×
1429
    goto _OVER;
×
1430
  }
1431

1432
  if ((code = grantCheck(TSDB_GRANT_STABLE)) < 0) {
8,916!
1433
    goto _OVER;
×
1434
  }
1435

1436
  if (isAlter) {
8,916✔
1437
    bool    needRsp = false;
92✔
1438
    SStbObj pDst = {0};
92✔
1439
    if ((code = mndBuildStbFromAlter(pStb, &pDst, &createReq)) != 0) {
92!
1440
      taosMemoryFreeClear(pDst.pTags);
×
1441
      taosMemoryFreeClear(pDst.pColumns);
×
1442
      taosMemoryFreeClear(pDst.pCmpr);
×
1443
      taosMemoryFreeClear(pDst.pExtSchemas);
×
1444
      goto _OVER;
×
1445
    }
1446

1447
    code = mndAlterStbImp(pMnode, pReq, pDb, &pDst, needRsp, NULL, 0);
92✔
1448
    taosMemoryFreeClear(pDst.pTags);
92!
1449
    taosMemoryFreeClear(pDst.pColumns);
92!
1450
    taosMemoryFreeClear(pDst.pCmpr);
92!
1451
    taosMemoryFreeClear(pDst.pExtSchemas);
92!
1452
  } else {
1453
    code = mndCreateStb(pMnode, pReq, &createReq, pDb);
8,824✔
1454
  }
1455
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
8,916✔
1456

1457
  SName name = {0};
8,916✔
1458
  TAOS_CHECK_RETURN(tNameFromString(&name, createReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
8,916!
1459

1460
  if (createReq.sql == NULL && createReq.sqlLen == 0) {
10,381!
1461
    char detail[1000] = {0};
1,465✔
1462

1463
    (void)tsnprintf(detail, sizeof(detail), "dbname:%s, stable name:%s", name.dbname, name.tname);
1,465✔
1464

1465
    auditRecord(pReq, pMnode->clusterId, "createStb", name.dbname, name.tname, detail, strlen(detail));
1,465✔
1466
  } else {
1467
    auditRecord(pReq, pMnode->clusterId, "createStb", name.dbname, name.tname, createReq.sql, createReq.sqlLen);
7,451✔
1468
  }
1469
_OVER:
9,025✔
1470
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
9,025✔
1471
    mError("stb:%s, failed to create since %s", createReq.name, tstrerror(code));
73!
1472
  }
1473

1474
  mndReleaseStb(pMnode, pStb);
9,025✔
1475
  mndReleaseDb(pMnode, pDb);
9,025✔
1476
  tFreeSMCreateStbReq(&createReq);
9,025✔
1477

1478
  if (pHash != NULL) {
9,025✔
1479
    taosHashCleanup(pHash);
8,917✔
1480
  }
1481

1482
  TAOS_RETURN(code);
9,025✔
1483
}
1484

1485
static int32_t mndCheckAlterStbReq(SMAlterStbReq *pAlter) {
6,695✔
1486
  int32_t code = 0;
6,695✔
1487
  if (pAlter->commentLen >= 0) return 0;
6,695!
1488
  if (pAlter->ttl != 0) return 0;
×
1489
  if (pAlter->keep != -1) return 0;
×
1490

1491
  if (pAlter->numOfFields < 1 || pAlter->numOfFields != (int32_t)taosArrayGetSize(pAlter->pFields)) {
×
1492
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
1493
    TAOS_RETURN(code);
×
1494
  }
1495

1496
  for (int32_t i = 0; i < pAlter->numOfFields; ++i) {
×
1497
    SField *pField = taosArrayGet(pAlter->pFields, i);
×
1498
    if (pField->name[0] == 0) {
×
1499
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
1500
      TAOS_RETURN(code);
×
1501
    }
1502
  }
1503

1504
  TAOS_RETURN(code);
×
1505
}
1506

1507
int32_t mndAllocStbSchemas(const SStbObj *pOld, SStbObj *pNew) {
7,672✔
1508
  pNew->pTags = taosMemoryCalloc(pNew->numOfTags, sizeof(SSchema));
7,672!
1509
  pNew->pColumns = taosMemoryCalloc(pNew->numOfColumns, sizeof(SSchema));
7,672!
1510
  pNew->pCmpr = taosMemoryCalloc(pNew->numOfColumns, sizeof(SColCmpr));
7,672!
1511
  if (pNew->pTags == NULL || pNew->pColumns == NULL || pNew->pCmpr == NULL) {
7,672!
1512
    TAOS_RETURN(terrno);
×
1513
  }
1514

1515
  memcpy(pNew->pColumns, pOld->pColumns, sizeof(SSchema) * pOld->numOfColumns);
7,672✔
1516
  memcpy(pNew->pTags, pOld->pTags, sizeof(SSchema) * pOld->numOfTags);
7,672✔
1517
  memcpy(pNew->pCmpr, pOld->pCmpr, sizeof(SColCmpr) * pOld->numOfColumns);
7,672✔
1518
  if (pOld->pExtSchemas) {
7,672✔
1519
    pNew->pExtSchemas = taosMemoryCalloc(pNew->numOfColumns, sizeof(SExtSchema));
4,123!
1520
    if (pNew->pExtSchemas == NULL) {
4,123!
1521
      TAOS_RETURN(terrno);
×
1522
    }
1523
    memcpy(pNew->pExtSchemas, pOld->pExtSchemas, sizeof(SExtSchema) * pOld->numOfColumns);
4,123✔
1524
  }
1525

1526
  TAOS_RETURN(0);
7,672✔
1527
}
1528

1529
static int32_t mndUpdateTableOptions(const SStbObj *pOld, SStbObj *pNew, char *pComment, int32_t commentLen,
34✔
1530
                                     int32_t ttl, int64_t keep) {
1531
  int32_t code = 0;
34✔
1532
  if (commentLen > 0) {
34✔
1533
    pNew->commentLen = commentLen;
23✔
1534
    pNew->comment = taosMemoryCalloc(1, commentLen + 1);
23!
1535
    if (pNew->comment == NULL) {
23!
1536
      terrno = TSDB_CODE_OUT_OF_MEMORY;
×
1537
      return -1;
×
1538
    }
1539
    memcpy(pNew->comment, pComment, commentLen + 1);
23✔
1540
  } else if (commentLen == 0) {
11!
1541
    pNew->commentLen = 0;
11✔
1542
  } else {
1543
  }
1544

1545
  if (ttl >= 0) {
34!
1546
    pNew->ttl = ttl;
34✔
1547
  }
1548

1549
  if (keep > 0) {
34!
1550
    pNew->keep = keep;
×
1551
  }
1552

1553
  if ((code = mndAllocStbSchemas(pOld, pNew)) != 0) {
34!
1554
    TAOS_RETURN(code);
×
1555
  }
1556
  TAOS_RETURN(code);
34✔
1557
}
1558

1559
static int32_t mndAddSuperTableTag(const SStbObj *pOld, SStbObj *pNew, SArray *pFields, int32_t ntags) {
838✔
1560
  int32_t code = 0;
838✔
1561
  if (pOld->numOfTags + ntags > TSDB_MAX_TAGS) {
838!
1562
    code = TSDB_CODE_MND_TOO_MANY_TAGS;
×
1563
    TAOS_RETURN(code);
×
1564
  }
1565

1566
  if (pOld->numOfColumns + ntags + pOld->numOfTags > TSDB_MAX_COLUMNS) {
838!
1567
    code = TSDB_CODE_MND_TOO_MANY_COLUMNS;
×
1568
    TAOS_RETURN(code);
×
1569
  }
1570

1571
  if (!mndValidateSchema(pOld->pTags, pOld->numOfTags, pFields, TSDB_MAX_TAGS_LEN)) {
838✔
1572
    code = TSDB_CODE_PAR_INVALID_TAGS_LENGTH;
40✔
1573
    TAOS_RETURN(code);
40✔
1574
  }
1575

1576
  pNew->numOfTags = pNew->numOfTags + ntags;
798✔
1577
  if ((code = mndAllocStbSchemas(pOld, pNew)) != 0) {
798!
1578
    TAOS_RETURN(code);
×
1579
  }
1580

1581
  if (pNew->nextColId < 0 || pNew->nextColId >= 0x7fff - ntags) {
798!
1582
    code = TSDB_CODE_OUT_OF_RANGE;
×
1583
    TAOS_RETURN(code);
×
1584
  }
1585

1586
  for (int32_t i = 0; i < ntags; i++) {
1,482✔
1587
    SField *pField = taosArrayGet(pFields, i);
798✔
1588
    if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
798✔
1589
      code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
6✔
1590
      TAOS_RETURN(code);
6✔
1591
    }
1592

1593
    if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
792✔
1594
      code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
108✔
1595
      TAOS_RETURN(code);
108✔
1596
    }
1597

1598
    SSchema *pSchema = &pNew->pTags[pOld->numOfTags + i];
684✔
1599
    pSchema->bytes = pField->bytes;
684✔
1600
    pSchema->type = pField->type;
684✔
1601
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
684✔
1602
    pSchema->colId = pNew->nextColId;
684✔
1603
    pNew->nextColId++;
684✔
1604

1605
    mInfo("stb:%s, start to add tag %s", pNew->name, pSchema->name);
684!
1606
  }
1607

1608
  pNew->tagVer++;
684✔
1609
  TAOS_RETURN(code);
684✔
1610
}
1611

1612
static int32_t mndCheckAlterColForTopic(SMnode *pMnode, const char *stbFullName, int64_t suid, col_id_t colId) {
3,073✔
1613
  int32_t code = 0;
3,073✔
1614
  SSdb   *pSdb = pMnode->pSdb;
3,073✔
1615
  void   *pIter = NULL;
3,073✔
1616
  while (1) {
1,053✔
1617
    SMqTopicObj *pTopic = NULL;
4,126✔
1618
    pIter = sdbFetch(pSdb, SDB_TOPIC, pIter, (void **)&pTopic);
4,126✔
1619
    if (pIter == NULL) break;
4,126✔
1620

1621
    mInfo("topic:%s, check tag and column modifiable, stb:%s suid:%" PRId64 " colId:%d, subType:%d sql:%s",
1,131!
1622
          pTopic->name, stbFullName, suid, colId, pTopic->subType, pTopic->sql);
1623
    if (pTopic->ast == NULL) {
1,131✔
1624
      sdbRelease(pSdb, pTopic);
103✔
1625
      continue;
103✔
1626
    }
1627

1628
    SNode *pAst = NULL;
1,028✔
1629
    if (nodesStringToNode(pTopic->ast, &pAst) != 0) {
1,028!
1630
      code = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TOPIC;
×
1631
      mError("topic:%s, create ast error", pTopic->name);
×
1632
      sdbRelease(pSdb, pTopic);
×
1633
      sdbCancelFetch(pSdb, pIter);
×
1634
      TAOS_RETURN(code);
78✔
1635
    }
1636

1637
    SNodeList *pNodeList = NULL;
1,028✔
1638
    if ((code = nodesCollectColumns((SSelectStmt *)pAst, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pNodeList)) !=
1,028!
1639
        0) {
1640
      sdbRelease(pSdb, pTopic);
×
1641
      sdbCancelFetch(pSdb, pIter);
×
1642
      TAOS_RETURN(code);
×
1643
    }
1644
    SNode *pNode = NULL;
1,028✔
1645
    FOREACH(pNode, pNodeList) {
1,669✔
1646
      SColumnNode *pCol = (SColumnNode *)pNode;
1,592✔
1647
      mInfo("topic:%s, check colId:%d tableId:%" PRId64 " ctbStbUid:%" PRId64, pTopic->name, pCol->colId, pCol->tableId,
1,592!
1648
            pTopic->ctbStbUid);
1649

1650
      if (pCol->tableId != suid && pTopic->ctbStbUid != suid) {
1,592✔
1651
        mInfo("topic:%s, check colId:%d passed", pTopic->name, pCol->colId);
873!
1652
        goto NEXT;
873✔
1653
      }
1654
      if (pCol->colId > 0 && pCol->colId == colId) {
719!
1655
        code = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TOPIC;
78✔
1656
        mError("topic:%s, check colId:%d conflicted", pTopic->name, pCol->colId);
78!
1657
        nodesDestroyNode(pAst);
78✔
1658
        nodesDestroyList(pNodeList);
78✔
1659
        sdbCancelFetch(pSdb, pIter);
78✔
1660
        sdbRelease(pSdb, pTopic);
78✔
1661
        TAOS_RETURN(code);
78✔
1662
      }
1663
      mInfo("topic:%s, check colId:%d passed", pTopic->name, pCol->colId);
641!
1664
    }
1665

1666
  NEXT:
77✔
1667
    sdbRelease(pSdb, pTopic);
950✔
1668
    nodesDestroyNode(pAst);
950✔
1669
    nodesDestroyList(pNodeList);
950✔
1670
  }
1671
  TAOS_RETURN(code);
2,995✔
1672
}
1673

1674
static int32_t mndCheckAlterColForStream(SMnode *pMnode, const char *stbFullName, int64_t suid, col_id_t colId) {
2,995✔
1675
  int32_t code = 0;
2,995✔
1676
  SSdb   *pSdb = pMnode->pSdb;
2,995✔
1677
  void   *pIter = NULL;
2,995✔
1678
  while (1) {
12✔
1679
    SStreamObj *pStream = NULL;
3,007✔
1680
    pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
3,007✔
1681
    if (pIter == NULL) break;
3,007✔
1682

1683
    SNode *pAst = NULL;
12✔
1684
    if (nodesStringToNode(pStream->ast, &pAst) != 0) {
12!
1685
      code = TSDB_CODE_MND_INVALID_STREAM_OPTION;
×
1686
      mError("stream:%s, create ast error", pStream->name);
×
1687
      sdbRelease(pSdb, pStream);
×
1688
      sdbCancelFetch(pSdb, pIter);
×
1689
      TAOS_RETURN(code);
×
1690
    }
1691

1692
    SNodeList *pNodeList = NULL;
12✔
1693
    if ((code = nodesCollectColumns((SSelectStmt *)pAst, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pNodeList)) !=
12!
1694
        0) {
1695
      sdbRelease(pSdb, pStream);
×
1696
      sdbCancelFetch(pSdb, pIter);
×
1697
      TAOS_RETURN(code);
×
1698
    }
1699

1700
    SNode *pNode = NULL;
12✔
1701
    FOREACH(pNode, pNodeList) {
12!
1702
      SColumnNode *pCol = (SColumnNode *)pNode;
12✔
1703

1704
      if (pCol->tableId != suid) {
12!
1705
        mInfo("stream:%s, check colId:%d passed", pStream->name, pCol->colId);
12!
1706
        goto NEXT;
12✔
1707
      }
1708
      if (pCol->colId > 0 && pCol->colId == colId) {
×
1709
        code = TSDB_CODE_MND_STREAM_MUST_BE_DELETED;
×
1710
        mError("stream:%s, check colId:%d conflicted", pStream->name, pCol->colId);
×
1711
        nodesDestroyNode(pAst);
×
1712
        nodesDestroyList(pNodeList);
×
1713
        sdbRelease(pSdb, pStream);
×
1714
        sdbCancelFetch(pSdb, pIter);
×
1715
        TAOS_RETURN(code);
×
1716
      }
1717
      mInfo("stream:%s, check colId:%d passed", pStream->name, pCol->colId);
×
1718
    }
1719

1720
  NEXT:
×
1721
    sdbRelease(pSdb, pStream);
12✔
1722
    nodesDestroyNode(pAst);
12✔
1723
    nodesDestroyList(pNodeList);
12✔
1724
  }
1725
  TAOS_RETURN(code);
2,995✔
1726
}
1727

1728
static int32_t mndCheckAlterColForTSma(SMnode *pMnode, const char *stbFullName, int64_t suid, col_id_t colId) {
2,995✔
1729
  int32_t code = 0;
2,995✔
1730
  SSdb   *pSdb = pMnode->pSdb;
2,995✔
1731
  void   *pIter = NULL;
2,995✔
1732
  while (1) {
×
1733
    SSmaObj *pSma = NULL;
2,995✔
1734
    pIter = sdbFetch(pSdb, SDB_SMA, pIter, (void **)&pSma);
2,995✔
1735
    if (pIter == NULL) break;
2,995!
1736

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

1740
    SNode *pAst = NULL;
×
1741
    if (nodesStringToNode(pSma->ast, &pAst) != 0) {
×
1742
      code = TSDB_CODE_SDB_INVALID_DATA_CONTENT;
×
1743
      mError("tsma:%s, check tag and column modifiable, stb:%s suid:%" PRId64 " colId:%d failed since parse AST err",
×
1744
             pSma->name, stbFullName, suid, colId);
1745
      sdbCancelFetch(pSdb, pIter);
×
1746
      TAOS_RETURN(code);
×
1747
    }
1748

1749
    SNodeList *pNodeList = NULL;
×
1750
    if ((code = nodesCollectColumns((SSelectStmt *)pAst, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pNodeList)) !=
×
1751
        0) {
1752
      sdbCancelFetch(pSdb, pIter);
×
1753
      TAOS_RETURN(code);
×
1754
    }
1755
    SNode *pNode = NULL;
×
1756
    FOREACH(pNode, pNodeList) {
×
1757
      SColumnNode *pCol = (SColumnNode *)pNode;
×
1758
      mInfo("tsma:%s, check colId:%d tableId:%" PRId64, pSma->name, pCol->colId, pCol->tableId);
×
1759

1760
      if ((pCol->tableId != suid) && (pSma->stbUid != suid)) {
×
1761
        mInfo("tsma:%s, check colId:%d passed", pSma->name, pCol->colId);
×
1762
        goto NEXT;
×
1763
      }
1764
      if ((pCol->colId) > 0 && (pCol->colId == colId)) {
×
1765
        code = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TSMA;
×
1766
        mError("tsma:%s, check colId:%d conflicted", pSma->name, pCol->colId);
×
1767
        nodesDestroyNode(pAst);
×
1768
        nodesDestroyList(pNodeList);
×
1769
        sdbRelease(pSdb, pSma);
×
1770
        sdbCancelFetch(pSdb, pIter);
×
1771
        TAOS_RETURN(code);
×
1772
      }
1773
      mInfo("tsma:%s, check colId:%d passed", pSma->name, pCol->colId);
×
1774
    }
1775

1776
  NEXT:
×
1777
    sdbRelease(pSdb, pSma);
×
1778
    nodesDestroyNode(pAst);
×
1779
    nodesDestroyList(pNodeList);
×
1780
  }
1781
  TAOS_RETURN(code);
2,995✔
1782
}
1783

1784
int32_t mndCheckColAndTagModifiable(SMnode *pMnode, const char *stbFullName, int64_t suid, col_id_t colId) {
3,073✔
1785
  TAOS_CHECK_RETURN(mndCheckAlterColForTopic(pMnode, stbFullName, suid, colId));
3,073✔
1786
  TAOS_CHECK_RETURN(mndCheckAlterColForStream(pMnode, stbFullName, suid, colId));
2,995!
1787
  TAOS_CHECK_RETURN(mndCheckAlterColForTSma(pMnode, stbFullName, suid, colId));
2,995!
1788
  TAOS_RETURN(0);
2,995✔
1789
}
1790

1791
static int32_t mndDropSuperTableTag(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const char *tagName) {
480✔
1792
  int32_t code = 0;
480✔
1793
  int32_t tag = mndFindSuperTableTagIndex(pOld, tagName);
480✔
1794
  if (tag < 0) {
480✔
1795
    code = TSDB_CODE_MND_TAG_NOT_EXIST;
4✔
1796
    TAOS_RETURN(code);
4✔
1797
  }
1798

1799
  col_id_t colId = pOld->pTags[tag].colId;
476✔
1800
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId));
476✔
1801

1802
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
458!
1803

1804
  memmove(pNew->pTags + tag, pNew->pTags + tag + 1, sizeof(SSchema) * (pNew->numOfTags - tag - 1));
458✔
1805
  pNew->numOfTags--;
458✔
1806

1807
  pNew->tagVer++;
458✔
1808

1809
  // if (mndDropIndexByTag(pMnode, pOld, tagName) != 0) {
1810
  //   return -1;
1811
  // }
1812
  mInfo("stb:%s, start to drop tag %s", pNew->name, tagName);
458!
1813
  TAOS_RETURN(code);
458✔
1814
}
1815

1816
static int32_t mndAlterStbTagName(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, SArray *pFields) {
731✔
1817
  int32_t code = 0;
731✔
1818
  if ((int32_t)taosArrayGetSize(pFields) != 2) {
731!
1819
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
1820
    TAOS_RETURN(code);
×
1821
  }
1822

1823
  SField *pField0 = taosArrayGet(pFields, 0);
731✔
1824
  SField *pField1 = taosArrayGet(pFields, 1);
731✔
1825

1826
  const char *oldTagName = pField0->name;
731✔
1827
  const char *newTagName = pField1->name;
731✔
1828

1829
  int32_t tag = mndFindSuperTableTagIndex(pOld, oldTagName);
731✔
1830
  if (tag < 0) {
731✔
1831
    code = TSDB_CODE_MND_TAG_NOT_EXIST;
14✔
1832
    TAOS_RETURN(code);
14✔
1833
  }
1834

1835
  col_id_t colId = pOld->pTags[tag].colId;
717✔
1836
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId));
717✔
1837

1838
  if (mndFindSuperTableTagIndex(pOld, newTagName) >= 0) {
700✔
1839
    code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
20✔
1840
    TAOS_RETURN(code);
20✔
1841
  }
1842

1843
  if (mndFindSuperTableColumnIndex(pOld, newTagName) >= 0) {
680✔
1844
    code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
1✔
1845
    TAOS_RETURN(code);
1✔
1846
  }
1847

1848
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
679!
1849

1850
  SSchema *pSchema = (SSchema *)(pNew->pTags + tag);
679✔
1851
  memcpy(pSchema->name, newTagName, TSDB_COL_NAME_LEN);
679✔
1852

1853
  pNew->tagVer++;
679✔
1854
  mInfo("stb:%s, start to modify tag %s to %s", pNew->name, oldTagName, newTagName);
679!
1855
  TAOS_RETURN(code);
679✔
1856
}
1857

1858
static int32_t mndAlterStbTagBytes(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const SField *pField) {
506✔
1859
  int32_t code = 0;
506✔
1860
  int32_t tag = mndFindSuperTableTagIndex(pOld, pField->name);
506✔
1861
  if (tag < 0) {
506✔
1862
    code = TSDB_CODE_MND_TAG_NOT_EXIST;
1✔
1863
    TAOS_RETURN(code);
1✔
1864
  }
1865

1866
  col_id_t colId = pOld->pTags[tag].colId;
505✔
1867
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId));
505✔
1868

1869
  uint32_t nLen = 0;
496✔
1870
  for (int32_t i = 0; i < pOld->numOfTags; ++i) {
18,901✔
1871
    nLen += (pOld->pTags[i].colId == colId) ? pField->bytes : pOld->pTags[i].bytes;
18,405✔
1872
  }
1873

1874
  if (nLen > TSDB_MAX_TAGS_LEN) {
496✔
1875
    code = TSDB_CODE_PAR_INVALID_TAGS_LENGTH;
289✔
1876
    TAOS_RETURN(code);
289✔
1877
  }
1878

1879
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
207!
1880

1881
  SSchema *pTag = pNew->pTags + tag;
207✔
1882

1883
  if (!(pTag->type == TSDB_DATA_TYPE_BINARY || pTag->type == TSDB_DATA_TYPE_VARBINARY ||
207!
1884
        pTag->type == TSDB_DATA_TYPE_NCHAR || pTag->type == TSDB_DATA_TYPE_GEOMETRY)) {
180!
1885
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
1✔
1886
    TAOS_RETURN(code);
1✔
1887
  }
1888

1889
  if (pField->bytes <= pTag->bytes) {
206✔
1890
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
57✔
1891
    TAOS_RETURN(code);
57✔
1892
  }
1893

1894
  pTag->bytes = pField->bytes;
149✔
1895
  pNew->tagVer++;
149✔
1896

1897
  mInfo("stb:%s, start to modify tag len %s to %d", pNew->name, pField->name, pField->bytes);
149!
1898
  TAOS_RETURN(code);
149✔
1899
}
1900

1901
static int32_t mndUpdateSuperTableColumnCompress(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, SArray *pField,
86✔
1902
                                                 int32_t nCols) {
1903
  // if (pColCmpr == NULL || colName == NULL) return -1;
1904

1905
  if (taosArrayGetSize(pField) != nCols) return TSDB_CODE_FAILED;
86!
1906
  TAOS_FIELD *p = taosArrayGet(pField, 0);
86✔
1907

1908
  int32_t code = 0;
86✔
1909
  int32_t idx = mndFindSuperTableColumnIndex(pOld, p->name);
86✔
1910
  if (idx == -1) {
86!
1911
    code = TSDB_CODE_MND_COLUMN_NOT_EXIST;
×
1912
    TAOS_RETURN(code);
×
1913
  }
1914
  SSchema *pTarget = &pOld->pColumns[idx];
86✔
1915
  col_id_t colId = pTarget->colId;
86✔
1916

1917
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
86!
1918
  code = validColCmprByType(pTarget->type, p->bytes);
86✔
1919
  if (code != TSDB_CODE_SUCCESS) {
86✔
1920
    TAOS_RETURN(code);
2✔
1921
  }
1922

1923
  int8_t updated = 0;
84✔
1924
  for (int i = 0; i < pNew->numOfColumns; i++) {
699!
1925
    SColCmpr *pCmpr = &pNew->pCmpr[i];
699✔
1926
    if (pCmpr->id == colId) {
699✔
1927
      uint32_t dst = 0;
84✔
1928
      updated = tUpdateCompress(pCmpr->alg, p->bytes, TSDB_COLVAL_COMPRESS_DISABLED, TSDB_COLVAL_LEVEL_DISABLED,
84✔
1929
                                TSDB_COLVAL_LEVEL_MEDIUM, &dst);
1930
      if (updated > 0) pCmpr->alg = dst;
84✔
1931
      break;
84✔
1932
    }
1933
  }
1934

1935
  if (updated == 0) {
84✔
1936
    code = TSDB_CODE_MND_COLUMN_COMPRESS_ALREADY_EXIST;
7✔
1937
    TAOS_RETURN(code);
7✔
1938
  } else if (updated == -1) {
77!
1939
    code = TSDB_CODE_TSC_COMPRESS_LEVEL_ERROR;
×
1940
    TAOS_RETURN(code);
×
1941
  }
1942

1943
  pNew->colVer++;
77✔
1944

1945
  TAOS_RETURN(code);
77✔
1946
}
1947
static int32_t mndAddSuperTableColumn(const SStbObj *pOld, SStbObj *pNew, const SMAlterStbReq* pReq, int32_t ncols,
2,538✔
1948
                                      int8_t withCompress) {
1949
  int32_t code = 0;
2,538✔
1950
  if (pOld->numOfColumns + ncols + pOld->numOfTags > TSDB_MAX_COLUMNS) {
2,538!
1951
    code = TSDB_CODE_MND_TOO_MANY_COLUMNS;
×
1952
    TAOS_RETURN(code);
×
1953
  }
1954

1955
  if ((code = grantCheck(TSDB_GRANT_TIMESERIES)) != 0) {
2,538!
1956
    TAOS_RETURN(code);
×
1957
  }
1958

1959
  if (!mndValidateSchema(pOld->pColumns, pOld->numOfColumns, pReq->pFields, TSDB_MAX_BYTES_PER_ROW)) {
2,538✔
1960
    code = TSDB_CODE_PAR_INVALID_ROW_LENGTH;
7✔
1961
    TAOS_RETURN(code);
7✔
1962
  }
1963

1964
  pNew->numOfColumns = pNew->numOfColumns + ncols;
2,531✔
1965

1966
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
2,531!
1967

1968
  if (pNew->nextColId < 0 || pNew->nextColId >= 0x7fff - ncols) {
2,531!
1969
    code = TSDB_CODE_OUT_OF_RANGE;
×
1970
    TAOS_RETURN(code);
×
1971
  }
1972

1973
  for (int32_t i = 0; i < ncols; i++) {
4,559✔
1974
    if (withCompress) {
2,531✔
1975
      SFieldWithOptions *pField = taosArrayGet(pReq->pFields, i);
242✔
1976
      if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
242!
1977
        code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
×
1978
        TAOS_RETURN(code);
×
1979
      }
1980

1981
      if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
242!
1982
        code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
×
1983
        TAOS_RETURN(code);
×
1984
      }
1985

1986
      SSchema *pSchema = &pNew->pColumns[pOld->numOfColumns + i];
242✔
1987
      pSchema->bytes = pField->bytes;
242✔
1988
      pSchema->type = pField->type;
242✔
1989
      memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
242✔
1990
      pSchema->colId = pNew->nextColId;
242✔
1991
      pNew->nextColId++;
242✔
1992

1993
      SColCmpr *pCmpr = &pNew->pCmpr[pOld->numOfColumns + i];
242✔
1994
      pCmpr->id = pSchema->colId;
242✔
1995
      pCmpr->alg = pField->compress;
242✔
1996
      mInfo("stb:%s, start to add column %s", pNew->name, pSchema->name);
242!
1997
    } else {
1998
      SField *pField = taosArrayGet(pReq->pFields, i);
2,289✔
1999
      if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
2,289✔
2000
        code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
496✔
2001
        TAOS_RETURN(code);
496✔
2002
      }
2003

2004
      if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
1,793✔
2005
        code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
7✔
2006
        TAOS_RETURN(code);
7✔
2007
      }
2008

2009
      SSchema *pSchema = &pNew->pColumns[pOld->numOfColumns + i];
1,786✔
2010
      pSchema->bytes = pField->bytes;
1,786✔
2011
      pSchema->type = pField->type;
1,786✔
2012
      memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
1,786✔
2013
      pSchema->colId = pNew->nextColId;
1,786✔
2014
      pNew->nextColId++;
1,786✔
2015

2016
      SColCmpr *pCmpr = &pNew->pCmpr[pOld->numOfColumns + i];
1,786✔
2017
      pCmpr->id = pSchema->colId;
1,786✔
2018
      pCmpr->alg = createDefaultColCmprByType(pSchema->type);
1,786✔
2019
      mInfo("stb:%s, start to add column %s", pNew->name, pSchema->name);
1,786!
2020
    }
2021
  }
2022
  // 1. old schema already has extschemas
2023
  // 2. new schema has extschemas
2024
  if (pReq->pTypeMods || pOld->pExtSchemas) {
2,028!
2025
    if (!pNew->pExtSchemas) {
2,026✔
2026
      // all ext schemas reset to zero
2027
      pNew->pExtSchemas = taosMemoryCalloc(pNew->numOfColumns, sizeof(SExtSchema));
93!
2028
      if (!pNew->pExtSchemas) TAOS_RETURN(terrno);
93!
2029
    }
2030
    if (pOld->pExtSchemas) {
2,026✔
2031
      memcpy(pNew->pExtSchemas, pOld->pExtSchemas, pOld->numOfColumns * sizeof(SExtSchema));
1,933✔
2032
    }
2033
    if (taosArrayGetSize(pReq->pTypeMods) > 0) {
2,026!
2034
      // copy added column ext schema
2035
      for (int32_t i = 0; i < ncols; ++i) {
4,052✔
2036
        pNew->pColumns[pOld->numOfColumns + i].flags |= COL_HAS_TYPE_MOD;
2,026✔
2037
        pNew->pExtSchemas[pOld->numOfColumns + i].typeMod = *(STypeMod *)taosArrayGet(pReq->pTypeMods, i);
2,026✔
2038
      }
2039
    }
2040
  }
2041

2042
  pNew->colVer++;
2,028✔
2043
  TAOS_RETURN(code);
2,028✔
2044
}
2045

2046
static int32_t mndDropSuperTableColumn(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const char *colName) {
654✔
2047
  int32_t code = 0;
654✔
2048
  int32_t col = mndFindSuperTableColumnIndex(pOld, colName);
654✔
2049
  if (col < 0) {
654✔
2050
    code = TSDB_CODE_MND_COLUMN_NOT_EXIST;
7✔
2051
    TAOS_RETURN(code);
7✔
2052
  }
2053

2054
  if (col == 0) {
647✔
2055
    code = TSDB_CODE_MND_INVALID_STB_ALTER_OPTION;
5✔
2056
    TAOS_RETURN(code);
5✔
2057
  }
2058

2059
  if (pOld->numOfColumns == 2) {
642✔
2060
    code = TSDB_CODE_PAR_INVALID_DROP_COL;
1✔
2061
    TAOS_RETURN(code);
1✔
2062
  }
2063

2064
  col_id_t colId = pOld->pColumns[col].colId;
641✔
2065
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId));
641✔
2066

2067
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
619!
2068

2069
  int32_t sz = pNew->numOfColumns - col - 1;
619✔
2070
  memmove(pNew->pColumns + col, pNew->pColumns + col + 1, sizeof(SSchema) * sz);
619✔
2071
  memmove(pNew->pCmpr + col, pNew->pCmpr + col + 1, sizeof(SColCmpr) * sz);
619✔
2072
  if (pOld->pExtSchemas) {
619✔
2073
    memmove(pNew->pExtSchemas + col, pNew->pExtSchemas + col + 1, sizeof(SExtSchema) * sz);
452✔
2074
  }
2075
  pNew->numOfColumns--;
619✔
2076

2077
  pNew->colVer++;
619✔
2078
  mInfo("stb:%s, start to drop col %s", pNew->name, colName);
619!
2079
  TAOS_RETURN(code);
619✔
2080
}
2081

2082
static int32_t mndAlterStbColumnBytes(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const SField *pField) {
802✔
2083
  int32_t code = 0;
802✔
2084
  int32_t col = mndFindSuperTableColumnIndex(pOld, pField->name);
802✔
2085
  if (col < 0) {
802✔
2086
    code = TSDB_CODE_MND_COLUMN_NOT_EXIST;
3✔
2087
    TAOS_RETURN(code);
3✔
2088
  }
2089

2090
  col_id_t colId = pOld->pColumns[col].colId;
799✔
2091

2092
  uint32_t nLen = 0;
799✔
2093
  for (int32_t i = 0; i < pOld->numOfColumns; ++i) {
30,937✔
2094
    nLen += (pOld->pColumns[i].colId == colId) ? pField->bytes : pOld->pColumns[i].bytes;
30,138✔
2095
  }
2096

2097
  if (nLen > TSDB_MAX_BYTES_PER_ROW) {
799✔
2098
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
65✔
2099
    TAOS_RETURN(code);
65✔
2100
  }
2101

2102
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId));
734✔
2103

2104
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
722!
2105

2106
  SSchema *pCol = pNew->pColumns + col;
722✔
2107
  if (!(pCol->type == TSDB_DATA_TYPE_BINARY || pCol->type == TSDB_DATA_TYPE_VARBINARY ||
722✔
2108
        pCol->type == TSDB_DATA_TYPE_NCHAR || pCol->type == TSDB_DATA_TYPE_GEOMETRY)) {
676!
2109
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
1✔
2110
    TAOS_RETURN(code);
1✔
2111
  }
2112

2113
  if (pField->bytes <= pCol->bytes) {
721✔
2114
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
321✔
2115
    TAOS_RETURN(code);
321✔
2116
  }
2117

2118
  pCol->bytes = pField->bytes;
400✔
2119
  pNew->colVer++;
400✔
2120

2121
  mInfo("stb:%s, start to modify col len %s to %d", pNew->name, pField->name, pField->bytes);
400!
2122
  TAOS_RETURN(code);
400✔
2123
}
2124

2125
static int32_t mndSetAlterStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
5,172✔
2126
  int32_t  code = 0;
5,172✔
2127
  SSdbRaw *pRedoRaw = mndStbActionEncode(pStb);
5,172✔
2128
  if (pRedoRaw == NULL) {
5,172!
2129
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2130
    if (terrno != 0) code = terrno;
×
2131
    TAOS_RETURN(code);
×
2132
  }
2133
  if ((code = mndTransAppendPrepareLog(pTrans, pRedoRaw)) != 0) {
5,172!
2134
    sdbFreeRaw(pRedoRaw);
×
2135
    TAOS_RETURN(code);
×
2136
  }
2137
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY));
5,172!
2138

2139
  TAOS_RETURN(code);
5,172✔
2140
}
2141

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

2156
  TAOS_RETURN(code);
5,172✔
2157
}
2158

2159
static int32_t mndSetAlterStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb, void *alterOriData,
5,172✔
2160
                                         int32_t alterOriDataLen) {
2161
  int32_t code = 0;
5,172✔
2162
  SSdb   *pSdb = pMnode->pSdb;
5,172✔
2163
  SVgObj *pVgroup = NULL;
5,172✔
2164
  void   *pIter = NULL;
5,172✔
2165
  int32_t contLen;
2166

2167
  while (1) {
16,617✔
2168
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
21,789✔
2169
    if (pIter == NULL) break;
21,789✔
2170
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
16,617✔
2171
      sdbRelease(pSdb, pVgroup);
5,979✔
2172
      continue;
5,979✔
2173
    }
2174

2175
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, alterOriData, alterOriDataLen);
10,638✔
2176
    if (pReq == NULL) {
10,638!
2177
      sdbCancelFetch(pSdb, pIter);
×
2178
      sdbRelease(pSdb, pVgroup);
×
2179
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2180
      if (terrno != 0) code = terrno;
×
2181
      TAOS_RETURN(code);
×
2182
    }
2183
    STransAction action = {0};
10,638✔
2184
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
10,638✔
2185
    action.pCont = pReq;
10,638✔
2186
    action.contLen = contLen;
10,638✔
2187
    action.msgType = TDMT_VND_ALTER_STB;
10,638✔
2188
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
10,638!
2189
      taosMemoryFree(pReq);
×
2190
      sdbCancelFetch(pSdb, pIter);
×
2191
      sdbRelease(pSdb, pVgroup);
×
2192
      TAOS_RETURN(code);
×
2193
    }
2194
    sdbRelease(pSdb, pVgroup);
10,638✔
2195
  }
2196

2197
  TAOS_RETURN(code);
5,172✔
2198
}
2199

2200
static int32_t mndSetAlterStbRedoActions2(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb,
×
2201
                                          void *alterOriData, int32_t alterOriDataLen) {
2202
  int32_t code = 0;
×
2203
  SSdb   *pSdb = pMnode->pSdb;
×
2204
  SVgObj *pVgroup = NULL;
×
2205
  void   *pIter = NULL;
×
2206
  int32_t contLen;
2207

2208
  while (1) {
×
2209
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
×
2210
    if (pIter == NULL) break;
×
2211
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
×
2212
      sdbRelease(pSdb, pVgroup);
×
2213
      continue;
×
2214
    }
2215

2216
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, alterOriData, alterOriDataLen);
×
2217
    if (pReq == NULL) {
×
2218
      sdbCancelFetch(pSdb, pIter);
×
2219
      sdbRelease(pSdb, pVgroup);
×
2220
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2221
      if (terrno != 0) code = terrno;
×
2222
      TAOS_RETURN(code);
×
2223
    }
2224
    STransAction action = {0};
×
2225
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
×
2226
    action.pCont = pReq;
×
2227
    action.contLen = contLen;
×
2228
    action.msgType = TDMT_VND_CREATE_INDEX;
×
2229
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
×
2230
      taosMemoryFree(pReq);
×
2231
      sdbCancelFetch(pSdb, pIter);
×
2232
      sdbRelease(pSdb, pVgroup);
×
2233
      TAOS_RETURN(code);
×
2234
    }
2235
    sdbRelease(pSdb, pVgroup);
×
2236
  }
2237

2238
  TAOS_RETURN(code);
×
2239
}
2240

2241
static int32_t mndBuildStbSchemaImp(SDbObj *pDb, SStbObj *pStb, const char *tbName, STableMetaRsp *pRsp) {
1,505,618✔
2242
  int32_t code = 0;
1,505,618✔
2243
  taosRLockLatch(&pStb->lock);
1,505,618✔
2244

2245
  int32_t totalCols = pStb->numOfColumns + pStb->numOfTags;
1,505,630✔
2246
  pRsp->pSchemas = taosMemoryCalloc(totalCols, sizeof(SSchema));
1,505,630!
2247
  if (pRsp->pSchemas == NULL) {
1,505,614!
2248
    taosRUnLockLatch(&pStb->lock);
×
2249
    code = terrno;
×
2250
    TAOS_RETURN(code);
×
2251
  }
2252
  pRsp->pSchemaExt = taosMemoryCalloc(pStb->numOfColumns, sizeof(SSchemaExt));
1,505,614!
2253
  if (pRsp->pSchemaExt == NULL) {
1,505,606!
2254
    taosRUnLockLatch(&pStb->lock);
×
2255
    code = terrno;
×
2256
    TAOS_RETURN(code);
×
2257
  }
2258
  pRsp->numOfColRefs = 0;
1,505,606✔
2259
  pRsp->pColRefs = NULL;
1,505,606✔
2260
  tstrncpy(pRsp->dbFName, pStb->db, sizeof(pRsp->dbFName));
1,505,606✔
2261
  tstrncpy(pRsp->tbName, tbName, sizeof(pRsp->tbName));
1,505,606✔
2262
  tstrncpy(pRsp->stbName, tbName, sizeof(pRsp->stbName));
1,505,606✔
2263
  pRsp->dbId = pDb->uid;
1,505,606✔
2264
  pRsp->numOfTags = pStb->numOfTags;
1,505,606✔
2265
  pRsp->numOfColumns = pStb->numOfColumns;
1,505,606✔
2266
  pRsp->precision = pDb->cfg.precision;
1,505,606✔
2267
  pRsp->tableType = TSDB_SUPER_TABLE;
1,505,606✔
2268
  pRsp->sversion = pStb->colVer;
1,505,606✔
2269
  pRsp->tversion = pStb->tagVer;
1,505,606✔
2270
  pRsp->suid = pStb->uid;
1,505,606✔
2271
  pRsp->tuid = pStb->uid;
1,505,606✔
2272
  pRsp->virtualStb = pStb->virtualStb;
1,505,606✔
2273

2274
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
40,792,371✔
2275
    SSchema *pSchema = &pRsp->pSchemas[i];
39,286,765✔
2276
    SSchema *pSrcSchema = &pStb->pColumns[i];
39,286,765✔
2277
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
39,286,765✔
2278
    pSchema->type = pSrcSchema->type;
39,286,765✔
2279
    pSchema->flags = pSrcSchema->flags;
39,286,765✔
2280
    pSchema->colId = pSrcSchema->colId;
39,286,765✔
2281
    pSchema->bytes = pSrcSchema->bytes;
39,286,765✔
2282
  }
2283

2284
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
23,876,710✔
2285
    SSchema *pSchema = &pRsp->pSchemas[i + pStb->numOfColumns];
22,371,104✔
2286
    SSchema *pSrcSchema = &pStb->pTags[i];
22,371,104✔
2287
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
22,371,104✔
2288
    pSchema->type = pSrcSchema->type;
22,371,104✔
2289
    pSchema->flags = pSrcSchema->flags;
22,371,104✔
2290
    pSchema->colId = pSrcSchema->colId;
22,371,104✔
2291
    pSchema->bytes = pSrcSchema->bytes;
22,371,104✔
2292
  }
2293
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
40,795,544✔
2294
    SColCmpr   *pCmpr = &pStb->pCmpr[i];
39,289,938✔
2295
    SSchemaExt *pSchEx = &pRsp->pSchemaExt[i];
39,289,938✔
2296
    pSchEx->colId = pCmpr->id;
39,289,938✔
2297
    pSchEx->compress = pCmpr->alg;
39,289,938✔
2298
    if (pStb->pExtSchemas) {
39,289,938✔
2299
      pSchEx->typeMod = pStb->pExtSchemas[i].typeMod;
1,467,641✔
2300
    }
2301
  }
2302

2303
  taosRUnLockLatch(&pStb->lock);
1,505,606✔
2304
  TAOS_RETURN(code);
1,505,636✔
2305
}
2306

2307
static int32_t mndBuildStbCfgImp(SDbObj *pDb, SStbObj *pStb, const char *tbName, STableCfgRsp *pRsp) {
66✔
2308
  int32_t code = 0;
66✔
2309
  taosRLockLatch(&pStb->lock);
66✔
2310

2311
  int32_t totalCols = pStb->numOfColumns + pStb->numOfTags;
66✔
2312
  pRsp->pSchemas = taosMemoryCalloc(totalCols, sizeof(SSchema));
66!
2313
  if (pRsp->pSchemas == NULL) {
66!
2314
    taosRUnLockLatch(&pStb->lock);
×
2315
    code = terrno;
×
2316
    TAOS_RETURN(code);
×
2317
  }
2318

2319
  tstrncpy(pRsp->dbFName, pStb->db, sizeof(pRsp->dbFName));
66✔
2320
  tstrncpy(pRsp->tbName, tbName, sizeof(pRsp->tbName));
66✔
2321
  tstrncpy(pRsp->stbName, tbName, sizeof(pRsp->stbName));
66✔
2322
  pRsp->numOfTags = pStb->numOfTags;
66✔
2323
  pRsp->numOfColumns = pStb->numOfColumns;
66✔
2324
  pRsp->tableType = TSDB_SUPER_TABLE;
66✔
2325
  pRsp->delay1 = pStb->maxdelay[0];
66✔
2326
  pRsp->delay2 = pStb->maxdelay[1];
66✔
2327
  pRsp->watermark1 = pStb->watermark[0];
66✔
2328
  pRsp->watermark2 = pStb->watermark[1];
66✔
2329
  pRsp->ttl = pStb->ttl;
66✔
2330
  pRsp->keep = pStb->keep;
66✔
2331
  pRsp->commentLen = pStb->commentLen;
66✔
2332
  if (pStb->commentLen > 0) {
66!
2333
    pRsp->pComment = taosStrdup(pStb->comment);
×
2334
  }
2335

2336
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
375✔
2337
    SSchema *pSchema = &pRsp->pSchemas[i];
309✔
2338
    SSchema *pSrcSchema = &pStb->pColumns[i];
309✔
2339
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
309✔
2340
    pSchema->type = pSrcSchema->type;
309✔
2341
    pSchema->flags = pSrcSchema->flags;
309✔
2342
    pSchema->colId = pSrcSchema->colId;
309✔
2343
    pSchema->bytes = pSrcSchema->bytes;
309✔
2344
  }
2345

2346
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
176✔
2347
    SSchema *pSchema = &pRsp->pSchemas[i + pStb->numOfColumns];
110✔
2348
    SSchema *pSrcSchema = &pStb->pTags[i];
110✔
2349
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
110✔
2350
    pSchema->type = pSrcSchema->type;
110✔
2351
    pSchema->flags = pSrcSchema->flags;
110✔
2352
    pSchema->colId = pSrcSchema->colId;
110✔
2353
    pSchema->bytes = pSrcSchema->bytes;
110✔
2354
  }
2355

2356
  if (pStb->numOfFuncs > 0) {
66!
2357
    pRsp->pFuncs = taosArrayDup(pStb->pFuncs, NULL);
×
2358
  }
2359

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

2364
    SSchemaExt *pSchExt = &pRsp->pSchemaExt[i];
309✔
2365
    pSchExt->colId = pCmpr->id;
309✔
2366
    pSchExt->compress = pCmpr->alg;
309✔
2367
    if (pStb->pExtSchemas) {
309✔
2368
      pSchExt->typeMod = pStb->pExtSchemas[i].typeMod;
165✔
2369
    }
2370
  }
2371
  pRsp->virtualStb = pStb->virtualStb;
66✔
2372
  pRsp->pColRefs = NULL;
66✔
2373

2374
  taosRUnLockLatch(&pStb->lock);
66✔
2375
  TAOS_RETURN(code);
66✔
2376
}
2377

2378
static int32_t mndValidateStbVersion(SMnode *pMnode, SSTableVersion *pStbVer, bool *schema, bool *sma) {
30,860✔
2379
  int32_t code = 0;
30,860✔
2380
  char    tbFName[TSDB_TABLE_FNAME_LEN] = {0};
30,860✔
2381
  snprintf(tbFName, sizeof(tbFName), "%s.%s", pStbVer->dbFName, pStbVer->stbName);
30,860✔
2382

2383
  SDbObj *pDb = mndAcquireDb(pMnode, pStbVer->dbFName);
30,860✔
2384
  if (pDb == NULL) {
30,860✔
2385
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
523✔
2386
    TAOS_RETURN(code);
523✔
2387
  }
2388

2389
  if (pDb->uid != pStbVer->dbId) {
30,337✔
2390
    mndReleaseDb(pMnode, pDb);
216✔
2391
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
216✔
2392
    TAOS_RETURN(code);
216✔
2393
  }
2394

2395
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
30,121✔
2396
  if (pStb == NULL) {
30,121✔
2397
    mndReleaseDb(pMnode, pDb);
81✔
2398
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
81✔
2399
    TAOS_RETURN(code);
81✔
2400
  }
2401

2402
  taosRLockLatch(&pStb->lock);
30,040✔
2403

2404
  if (pStbVer->sversion != pStb->colVer || pStbVer->tversion != pStb->tagVer) {
30,040✔
2405
    *schema = true;
335✔
2406
  } else {
2407
    *schema = false;
29,705✔
2408
  }
2409

2410
  if (pStbVer->smaVer && pStbVer->smaVer != pStb->smaVer) {
30,040!
2411
    *sma = true;
×
2412
  } else {
2413
    *sma = false;
30,040✔
2414
  }
2415

2416
  taosRUnLockLatch(&pStb->lock);
30,040✔
2417

2418
  mndReleaseDb(pMnode, pDb);
30,040✔
2419
  mndReleaseStb(pMnode, pStb);
30,040✔
2420
  return TSDB_CODE_SUCCESS;
30,040✔
2421
}
2422

2423
static int32_t mndBuildStbSchema(SMnode *pMnode, const char *dbFName, const char *tbName, STableMetaRsp *pRsp) {
1,494,100✔
2424
  int32_t code = 0;
1,494,100✔
2425
  char    tbFName[TSDB_TABLE_FNAME_LEN] = {0};
1,494,100✔
2426
  snprintf(tbFName, sizeof(tbFName), "%s.%s", dbFName, tbName);
1,494,100✔
2427

2428
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
1,494,100✔
2429
  if (pDb == NULL) {
1,494,075!
2430
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
2431
    TAOS_RETURN(code);
×
2432
  }
2433

2434
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
1,494,075✔
2435
  if (pStb == NULL) {
1,494,079✔
2436
    mndReleaseDb(pMnode, pDb);
2,804✔
2437
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
2,804✔
2438
    TAOS_RETURN(code);
2,804✔
2439
  }
2440

2441
  code = mndBuildStbSchemaImp(pDb, pStb, tbName, pRsp);
1,491,275✔
2442
  mndReleaseDb(pMnode, pDb);
1,491,269✔
2443
  mndReleaseStb(pMnode, pStb);
1,491,298✔
2444
  TAOS_RETURN(code);
1,491,297✔
2445
}
2446

2447
static int32_t mndBuildStbCfg(SMnode *pMnode, const char *dbFName, const char *tbName, STableCfgRsp *pRsp) {
66✔
2448
  int32_t code = 0;
66✔
2449
  char    tbFName[TSDB_TABLE_FNAME_LEN] = {0};
66✔
2450
  snprintf(tbFName, sizeof(tbFName), "%s.%s", dbFName, tbName);
66✔
2451

2452
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
66✔
2453
  if (pDb == NULL) {
66!
2454
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
2455
    TAOS_RETURN(code);
×
2456
  }
2457

2458
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
66✔
2459
  if (pStb == NULL) {
66!
2460
    mndReleaseDb(pMnode, pDb);
×
2461
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
×
2462
    TAOS_RETURN(code);
×
2463
  }
2464

2465
  code = mndBuildStbCfgImp(pDb, pStb, tbName, pRsp);
66✔
2466

2467
  mndReleaseDb(pMnode, pDb);
66✔
2468
  mndReleaseStb(pMnode, pStb);
66✔
2469
  TAOS_RETURN(code);
66✔
2470
}
2471

2472
static int32_t mndBuildSMAlterStbRsp(SDbObj *pDb, SStbObj *pObj, void **pCont, int32_t *pLen) {
5,046✔
2473
  int32_t       code = 0;
5,046✔
2474
  SEncoder      ec = {0};
5,046✔
2475
  uint32_t      contLen = 0;
5,046✔
2476
  SMAlterStbRsp alterRsp = {0};
5,046✔
2477
  SName         name = {0};
5,046✔
2478
  TAOS_CHECK_RETURN(tNameFromString(&name, pObj->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
5,046!
2479

2480
  alterRsp.pMeta = taosMemoryCalloc(1, sizeof(STableMetaRsp));
5,046!
2481
  if (NULL == alterRsp.pMeta) {
5,046!
2482
    code = terrno;
×
2483
    TAOS_RETURN(code);
×
2484
  }
2485

2486
  code = mndBuildStbSchemaImp(pDb, pObj, name.tname, alterRsp.pMeta);
5,046✔
2487
  if (code) {
5,046!
2488
    tFreeSMAlterStbRsp(&alterRsp);
×
2489
    return code;
×
2490
  }
2491

2492
  tEncodeSize(tEncodeSMAlterStbRsp, &alterRsp, contLen, code);
5,046!
2493
  if (code) {
5,046!
2494
    tFreeSMAlterStbRsp(&alterRsp);
×
2495
    return code;
×
2496
  }
2497

2498
  void *cont = taosMemoryMalloc(contLen);
5,046!
2499
  if (NULL == cont) {
5,046!
2500
    code = terrno;
×
2501
    tFreeSMAlterStbRsp(&alterRsp);
×
2502
    TAOS_RETURN(code);
×
2503
  }
2504
  tEncoderInit(&ec, cont, contLen);
5,046✔
2505
  code = tEncodeSMAlterStbRsp(&ec, &alterRsp);
5,046✔
2506
  tEncoderClear(&ec);
5,046✔
2507

2508
  tFreeSMAlterStbRsp(&alterRsp);
5,046✔
2509

2510
  if (code < 0) TAOS_RETURN(code);
5,046!
2511

2512
  *pCont = cont;
5,046✔
2513
  *pLen = contLen;
5,046✔
2514

2515
  TAOS_RETURN(code);
5,046✔
2516
}
2517

2518
int32_t mndBuildSMCreateStbRsp(SMnode *pMnode, char *dbFName, char *stbFName, void **pCont, int32_t *pLen) {
9,318✔
2519
  int32_t code = -1;
9,318✔
2520
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
9,318✔
2521
  if (NULL == pDb) {
9,318!
2522
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2523
    if (terrno != 0) code = terrno;
×
2524
    TAOS_RETURN(code);
×
2525
  }
2526

2527
  SStbObj *pObj = mndAcquireStb(pMnode, stbFName);
9,318✔
2528
  if (NULL == pObj) {
9,318✔
2529
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
8✔
2530
    if (terrno != 0) code = terrno;
8!
2531
    goto _OVER;
8✔
2532
  }
2533

2534
  SEncoder       ec = {0};
9,310✔
2535
  uint32_t       contLen = 0;
9,310✔
2536
  SMCreateStbRsp stbRsp = {0};
9,310✔
2537
  SName          name = {0};
9,310✔
2538
  TAOS_CHECK_GOTO(tNameFromString(&name, pObj->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE), NULL, _OVER);
9,310!
2539

2540
  stbRsp.pMeta = taosMemoryCalloc(1, sizeof(STableMetaRsp));
9,310!
2541
  if (NULL == stbRsp.pMeta) {
9,310!
2542
    code = terrno;
×
2543
    goto _OVER;
×
2544
  }
2545

2546
  code = mndBuildStbSchemaImp(pDb, pObj, name.tname, stbRsp.pMeta);
9,310✔
2547
  if (code) {
9,310!
2548
    tFreeSMCreateStbRsp(&stbRsp);
×
2549
    goto _OVER;
×
2550
  }
2551

2552
  tEncodeSize(tEncodeSMCreateStbRsp, &stbRsp, contLen, code);
9,310!
2553
  if (code) {
9,310!
2554
    tFreeSMCreateStbRsp(&stbRsp);
×
2555
    goto _OVER;
×
2556
  }
2557

2558
  void *cont = taosMemoryMalloc(contLen);
9,310!
2559
  if (NULL == cont) {
9,310!
2560
    code = terrno;
×
2561
    tFreeSMCreateStbRsp(&stbRsp);
×
2562
    goto _OVER;
×
2563
  }
2564
  tEncoderInit(&ec, cont, contLen);
9,310✔
2565
  TAOS_CHECK_GOTO(tEncodeSMCreateStbRsp(&ec, &stbRsp), NULL, _OVER);
9,310!
2566
  tEncoderClear(&ec);
9,310✔
2567

2568
  tFreeSMCreateStbRsp(&stbRsp);
9,310✔
2569

2570
  *pCont = cont;
9,310✔
2571
  *pLen = contLen;
9,310✔
2572

2573
  code = 0;
9,310✔
2574

2575
_OVER:
9,318✔
2576
  if (pObj) {
9,318✔
2577
    mndReleaseStb(pMnode, pObj);
9,310✔
2578
  }
2579

2580
  if (pDb) {
9,318!
2581
    mndReleaseDb(pMnode, pDb);
9,318✔
2582
  }
2583

2584
  TAOS_RETURN(code);
9,318✔
2585
}
2586

2587
static int32_t mndAlterStbImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
4,083✔
2588
                              void *alterOriData, int32_t alterOriDataLen) {
2589
  int32_t code = -1;
4,083✔
2590
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "alter-stb");
4,083✔
2591
  if (pTrans == NULL) {
4,083!
2592
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2593
    if (terrno != 0) code = terrno;
×
2594
    goto _OVER;
×
2595
  }
2596

2597
  mInfo("trans:%d, used to alter stb:%s", pTrans->id, pStb->name);
4,083!
2598
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
4,083✔
2599
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
4,083✔
2600

2601
  if (needRsp) {
4,035✔
2602
    void   *pCont = NULL;
3,909✔
2603
    int32_t contLen = 0;
3,909✔
2604
    TAOS_CHECK_GOTO(mndBuildSMAlterStbRsp(pDb, pStb, &pCont, &contLen), NULL, _OVER);
3,909!
2605
    mndTransSetRpcRsp(pTrans, pCont, contLen);
3,909✔
2606
  }
2607

2608
  TAOS_CHECK_GOTO(mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
4,035!
2609
  TAOS_CHECK_GOTO(mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
4,035!
2610
  TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
4,035!
2611
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
4,035!
2612

2613
  code = 0;
4,035✔
2614

2615
_OVER:
4,083✔
2616
  mndTransDrop(pTrans);
4,083✔
2617
  TAOS_RETURN(code);
4,083✔
2618
}
2619

2620
static int32_t mndAlterStbAndUpdateTagIdxImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
1,137✔
2621
                                             void *alterOriData, int32_t alterOriDataLen, const SMAlterStbReq *pAlter) {
2622
  int32_t code = -1;
1,137✔
2623
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "alter-stb");
1,137✔
2624
  if (pTrans == NULL) {
1,137!
2625
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2626
    if (terrno != 0) code = terrno;
×
2627
    goto _OVER;
×
2628
  }
2629

2630
  mInfo("trans:%d, used to alter stb:%s", pTrans->id, pStb->name);
1,137!
2631
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
1,137✔
2632

2633
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
1,137!
2634

2635
  if (needRsp) {
1,137!
2636
    void   *pCont = NULL;
1,137✔
2637
    int32_t contLen = 0;
1,137✔
2638
    TAOS_CHECK_GOTO(mndBuildSMAlterStbRsp(pDb, pStb, &pCont, &contLen), NULL, _OVER);
1,137!
2639
    mndTransSetRpcRsp(pTrans, pCont, contLen);
1,137✔
2640
  }
2641

2642
  if (pAlter->alterType == TSDB_ALTER_TABLE_DROP_TAG) {
1,137✔
2643
    SIdxObj idxObj = {0};
458✔
2644
    SField *pField0 = taosArrayGet(pAlter->pFields, 0);
458✔
2645
    bool    exist = false;
458✔
2646
    if (mndGetIdxsByTagName(pMnode, pStb, pField0->name, &idxObj) == 0) {
458✔
2647
      exist = true;
20✔
2648
    }
2649
    TAOS_CHECK_GOTO(mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
458!
2650
    TAOS_CHECK_GOTO(mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
458!
2651

2652
    if (exist == true) {
458✔
2653
      TAOS_CHECK_GOTO(mndSetDropIdxPrepareLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
20!
2654
      TAOS_CHECK_GOTO(mndSetDropIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
20!
2655
    }
2656

2657
    TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
458!
2658
    TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
458!
2659

2660
  } else if (pAlter->alterType == TSDB_ALTER_TABLE_UPDATE_TAG_NAME) {
679!
2661
    SIdxObj     idxObj = {0};
679✔
2662
    SField     *pField0 = taosArrayGet(pAlter->pFields, 0);
679✔
2663
    SField     *pField1 = taosArrayGet(pAlter->pFields, 1);
679✔
2664
    const char *oTagName = pField0->name;
679✔
2665
    const char *nTagName = pField1->name;
679✔
2666
    bool        exist = false;
679✔
2667

2668
    if (mndGetIdxsByTagName(pMnode, pStb, pField0->name, &idxObj) == 0) {
679✔
2669
      exist = true;
49✔
2670
    }
2671

2672
    TAOS_CHECK_GOTO(mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
679!
2673
    TAOS_CHECK_GOTO(mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
679!
2674

2675
    if (exist == true) {
679✔
2676
      memcpy(idxObj.colName, nTagName, strlen(nTagName));
49✔
2677
      idxObj.colName[strlen(nTagName)] = 0;
49✔
2678
      TAOS_CHECK_GOTO(mndSetAlterIdxPrepareLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
49!
2679
      TAOS_CHECK_GOTO(mndSetAlterIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
49!
2680
    }
2681

2682
    TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
679!
2683
    TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
679!
2684
  }
2685
  code = 0;
1,137✔
2686

2687
_OVER:
1,137✔
2688
  mndTransDrop(pTrans);
1,137✔
2689
  TAOS_RETURN(code);
1,137✔
2690
}
2691

2692
static int32_t mndAlterStb(SMnode *pMnode, SRpcMsg *pReq, const SMAlterStbReq *pAlter, SDbObj *pDb, SStbObj *pOld) {
6,669✔
2693
  bool    needRsp = true;
6,669✔
2694
  int32_t code = -1;
6,669✔
2695
  SField *pField0 = NULL;
6,669✔
2696

2697
  SStbObj stbObj = {0};
6,669✔
2698
  taosRLockLatch(&pOld->lock);
6,669✔
2699
  memcpy(&stbObj, pOld, sizeof(SStbObj));
6,669✔
2700
  taosRUnLockLatch(&pOld->lock);
6,669✔
2701
  stbObj.pColumns = NULL;
6,669✔
2702
  stbObj.pTags = NULL;
6,669✔
2703
  stbObj.pFuncs = NULL;
6,669✔
2704
  stbObj.pCmpr = NULL;
6,669✔
2705
  stbObj.pExtSchemas = NULL;
6,669✔
2706
  stbObj.updateTime = taosGetTimestampMs();
6,669✔
2707
  stbObj.lock = 0;
6,669✔
2708
  stbObj.virtualStb = pOld->virtualStb;
6,669✔
2709
  bool updateTagIndex = false;
6,669✔
2710
  switch (pAlter->alterType) {
6,669!
2711
    case TSDB_ALTER_TABLE_ADD_TAG:
838✔
2712
      code = mndAddSuperTableTag(pOld, &stbObj, pAlter->pFields, pAlter->numOfFields);
838✔
2713
      break;
838✔
2714
    case TSDB_ALTER_TABLE_DROP_TAG:
480✔
2715
      pField0 = taosArrayGet(pAlter->pFields, 0);
480✔
2716
      code = mndDropSuperTableTag(pMnode, pOld, &stbObj, pField0->name);
480✔
2717
      updateTagIndex = true;
480✔
2718
      break;
480✔
2719
    case TSDB_ALTER_TABLE_UPDATE_TAG_NAME:
731✔
2720
      code = mndAlterStbTagName(pMnode, pOld, &stbObj, pAlter->pFields);
731✔
2721
      updateTagIndex = true;
731✔
2722
      break;
731✔
2723
    case TSDB_ALTER_TABLE_UPDATE_TAG_BYTES:
506✔
2724
      pField0 = taosArrayGet(pAlter->pFields, 0);
506✔
2725
      code = mndAlterStbTagBytes(pMnode, pOld, &stbObj, pField0);
506✔
2726
      break;
506✔
2727
    case TSDB_ALTER_TABLE_ADD_COLUMN:
2,296✔
2728
      code = mndAddSuperTableColumn(pOld, &stbObj, pAlter, pAlter->numOfFields, 0);
2,296✔
2729
      break;
2,296✔
2730
    case TSDB_ALTER_TABLE_DROP_COLUMN:
654✔
2731
      pField0 = taosArrayGet(pAlter->pFields, 0);
654✔
2732
      code = mndDropSuperTableColumn(pMnode, pOld, &stbObj, pField0->name);
654✔
2733
      break;
654✔
2734
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES:
802✔
2735
      pField0 = taosArrayGet(pAlter->pFields, 0);
802✔
2736
      code = mndAlterStbColumnBytes(pMnode, pOld, &stbObj, pField0);
802✔
2737
      break;
802✔
2738
    case TSDB_ALTER_TABLE_UPDATE_OPTIONS:
34✔
2739
      needRsp = false;
34✔
2740
      code = mndUpdateTableOptions(pOld, &stbObj, pAlter->comment, pAlter->commentLen, pAlter->ttl, pAlter->keep);
34✔
2741
      break;
34✔
2742
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_COMPRESS:
86✔
2743
      code = mndUpdateSuperTableColumnCompress(pMnode, pOld, &stbObj, pAlter->pFields, pAlter->numOfFields);
86✔
2744
      break;
86✔
2745
    case TSDB_ALTER_TABLE_ADD_COLUMN_WITH_COMPRESS_OPTION:
242✔
2746
      code = mndAddSuperTableColumn(pOld, &stbObj, pAlter, pAlter->numOfFields, 1);
242✔
2747
      break;
242✔
2748
    default:
×
2749
      needRsp = false;
×
2750
      terrno = TSDB_CODE_OPS_NOT_SUPPORT;
×
2751
      break;
×
2752
  }
2753

2754
  if (code != 0) goto _OVER;
6,669✔
2755
  if (updateTagIndex == false) {
5,128✔
2756
    code = mndAlterStbImp(pMnode, pReq, pDb, &stbObj, needRsp, pReq->pCont, pReq->contLen);
3,991✔
2757
  } else {
2758
    code = mndAlterStbAndUpdateTagIdxImp(pMnode, pReq, pDb, &stbObj, needRsp, pReq->pCont, pReq->contLen, pAlter);
1,137✔
2759
  }
2760

2761
_OVER:
6,669✔
2762
  taosMemoryFreeClear(stbObj.pTags);
6,669!
2763
  taosMemoryFreeClear(stbObj.pColumns);
6,669!
2764
  taosMemoryFreeClear(stbObj.pCmpr);
6,669!
2765
  if (pAlter->commentLen > 0) {
6,669✔
2766
    taosMemoryFreeClear(stbObj.comment);
23!
2767
  }
2768
  taosMemoryFreeClear(stbObj.pExtSchemas);
6,669!
2769
  TAOS_RETURN(code);
6,669✔
2770
}
2771

2772
static int32_t mndProcessAlterStbReq(SRpcMsg *pReq) {
6,695✔
2773
  SMnode       *pMnode = pReq->info.node;
6,695✔
2774
  int32_t       code = -1;
6,695✔
2775
  SDbObj       *pDb = NULL;
6,695✔
2776
  SStbObj      *pStb = NULL;
6,695✔
2777
  SMAlterStbReq alterReq = {0};
6,695✔
2778

2779
  if (tDeserializeSMAlterStbReq(pReq->pCont, pReq->contLen, &alterReq) != 0) {
6,695!
2780
    code = TSDB_CODE_INVALID_MSG;
×
2781
    goto _OVER;
×
2782
  }
2783

2784
  mInfo("stb:%s, start to alter", alterReq.name);
6,695!
2785
  if (mndCheckAlterStbReq(&alterReq) != 0) goto _OVER;
6,695!
2786

2787
  pDb = mndAcquireDbByStb(pMnode, alterReq.name);
6,695✔
2788
  if (pDb == NULL) {
6,695✔
2789
    code = TSDB_CODE_MND_DB_NOT_EXIST;
2✔
2790
    goto _OVER;
2✔
2791
  }
2792

2793
  pStb = mndAcquireStb(pMnode, alterReq.name);
6,693✔
2794
  if (pStb == NULL) {
6,693✔
2795
    code = TSDB_CODE_MND_STB_NOT_EXIST;
24✔
2796
    goto _OVER;
24✔
2797
  }
2798

2799
  if ((code = mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_WRITE_DB, pDb)) != 0) {
6,669!
2800
    goto _OVER;
×
2801
  }
2802

2803
  code = mndAlterStb(pMnode, pReq, &alterReq, pDb, pStb);
6,669✔
2804
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
6,669✔
2805

2806
  SName   name = {0};
6,669✔
2807
  int32_t ret = 0;
6,669✔
2808
  if ((ret = tNameFromString(&name, alterReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0)
6,669!
2809
    mError("stb:%s, failed to tNameFromString since %s", alterReq.name, tstrerror(ret));
×
2810

2811
  auditRecord(pReq, pMnode->clusterId, "alterStb", name.dbname, name.tname, alterReq.sql, alterReq.sqlLen);
6,669✔
2812

2813
_OVER:
6,695✔
2814
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
6,695!
2815
    mError("stb:%s, failed to alter since %s", alterReq.name, tstrerror(code));
1,615!
2816
  }
2817

2818
  mndReleaseStb(pMnode, pStb);
6,695✔
2819
  mndReleaseDb(pMnode, pDb);
6,695✔
2820
  tFreeSMAltertbReq(&alterReq);
6,695✔
2821

2822
  TAOS_RETURN(code);
6,695✔
2823
}
2824

2825
static int32_t mndSetDropStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SStbObj *pStb) {
1,347✔
2826
  int32_t  code = 0;
1,347✔
2827
  SSdbRaw *pRedoRaw = mndStbActionEncode(pStb);
1,347✔
2828
  if (pRedoRaw == NULL) {
1,347!
2829
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2830
    if (terrno != 0) code = terrno;
×
2831
    TAOS_RETURN(code);
×
2832
  }
2833
  if ((code = mndTransAppendPrepareLog(pTrans, pRedoRaw)) != 0) {
1,347!
2834
    sdbFreeRaw(pRedoRaw);
×
2835
    TAOS_RETURN(code);
×
2836
  }
2837
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_DROPPING));
1,347!
2838

2839
  TAOS_RETURN(code);
1,347✔
2840
}
2841

2842
static int32_t mndSetDropStbCommitLogs(SMnode *pMnode, STrans *pTrans, SStbObj *pStb) {
1,347✔
2843
  int32_t  code = 0;
1,347✔
2844
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
1,347✔
2845
  if (pCommitRaw == NULL) {
1,347!
2846
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2847
    if (terrno != 0) code = terrno;
×
2848
    TAOS_RETURN(code);
×
2849
  }
2850
  if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
1,347!
2851
    sdbFreeRaw(pCommitRaw);
×
2852
    TAOS_RETURN(code);
×
2853
  }
2854
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED));
1,347!
2855

2856
  TAOS_RETURN(code);
1,347✔
2857
}
2858

2859
static int32_t mndSetDropStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
1,347✔
2860
  int32_t code = 0;
1,347✔
2861
  SSdb   *pSdb = pMnode->pSdb;
1,347✔
2862
  SVgObj *pVgroup = NULL;
1,347✔
2863
  void   *pIter = NULL;
1,347✔
2864

2865
  while (1) {
4,681✔
2866
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
6,028✔
2867
    if (pIter == NULL) break;
6,028✔
2868
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
4,681✔
2869
      sdbRelease(pSdb, pVgroup);
1,803✔
2870
      continue;
1,803✔
2871
    }
2872

2873
    int32_t contLen = 0;
2,878✔
2874
    void   *pReq = mndBuildVDropStbReq(pMnode, pVgroup, pStb, &contLen);
2,878✔
2875
    if (pReq == NULL) {
2,878!
2876
      sdbCancelFetch(pSdb, pIter);
×
2877
      sdbRelease(pSdb, pVgroup);
×
2878
      code = TSDB_CODE_OUT_OF_MEMORY;
×
2879
      TAOS_RETURN(code);
×
2880
    }
2881

2882
    STransAction action = {0};
2,878✔
2883
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
2,878✔
2884
    action.pCont = pReq;
2,878✔
2885
    action.contLen = contLen;
2,878✔
2886
    action.msgType = TDMT_VND_DROP_STB;
2,878✔
2887
    action.acceptableCode = TSDB_CODE_TDB_STB_NOT_EXIST;
2,878✔
2888
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
2,878!
2889
      taosMemoryFree(pReq);
×
2890
      sdbCancelFetch(pSdb, pIter);
×
2891
      sdbRelease(pSdb, pVgroup);
×
2892
      TAOS_RETURN(code);
×
2893
    }
2894
    sdbRelease(pSdb, pVgroup);
2,878✔
2895
  }
2896

2897
  TAOS_RETURN(code);
1,347✔
2898
}
2899

2900
static int32_t mndDropStb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb) {
1,347✔
2901
  int32_t code = -1;
1,347✔
2902
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "drop-stb");
1,347✔
2903
  if (pTrans == NULL) {
1,347!
2904
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2905
    if (terrno != 0) code = terrno;
×
2906
    goto _OVER;
×
2907
  }
2908

2909
  mInfo("trans:%d, used to drop stb:%s", pTrans->id, pStb->name);
1,347!
2910
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
1,347✔
2911
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
1,347!
2912

2913
  TAOS_CHECK_GOTO(mndSetDropStbPrepareLogs(pMnode, pTrans, pStb), NULL, _OVER);
1,347!
2914
  TAOS_CHECK_GOTO(mndSetDropStbCommitLogs(pMnode, pTrans, pStb), NULL, _OVER);
1,347!
2915
  TAOS_CHECK_GOTO(mndSetDropStbRedoActions(pMnode, pTrans, pDb, pStb), NULL, _OVER);
1,347!
2916
  TAOS_CHECK_GOTO(mndDropIdxsByStb(pMnode, pTrans, pDb, pStb), NULL, _OVER);
1,347!
2917
  TAOS_CHECK_GOTO(mndDropSmasByStb(pMnode, pTrans, pDb, pStb), NULL, _OVER);
1,347!
2918
  TAOS_CHECK_GOTO(mndUserRemoveStb(pMnode, pTrans, pStb->name), NULL, _OVER);
1,347!
2919
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
1,347!
2920
  code = 0;
1,347✔
2921

2922
_OVER:
1,347✔
2923
  mndTransDrop(pTrans);
1,347✔
2924
  TAOS_RETURN(code);
1,347✔
2925
}
2926

2927
static int32_t mndCheckDropStbForTopic(SMnode *pMnode, const char *stbFullName, int64_t suid) {
1,351✔
2928
  int32_t code = 0;
1,351✔
2929
  SSdb   *pSdb = pMnode->pSdb;
1,351✔
2930
  void   *pIter = NULL;
1,351✔
2931
  while (1) {
98✔
2932
    SMqTopicObj *pTopic = NULL;
1,449✔
2933
    pIter = sdbFetch(pSdb, SDB_TOPIC, pIter, (void **)&pTopic);
1,449✔
2934
    if (pIter == NULL) break;
1,449✔
2935

2936
    if (pTopic->subType == TOPIC_SUB_TYPE__TABLE) {
98✔
2937
      if (pTopic->stbUid == suid) {
14!
2938
        sdbRelease(pSdb, pTopic);
×
2939
        sdbCancelFetch(pSdb, pIter);
×
2940
        TAOS_RETURN(-1);
×
2941
      }
2942
    }
2943

2944
    if (pTopic->ast == NULL) {
98✔
2945
      sdbRelease(pSdb, pTopic);
38✔
2946
      continue;
38✔
2947
    }
2948

2949
    SNode *pAst = NULL;
60✔
2950
    if (nodesStringToNode(pTopic->ast, &pAst) != 0) {
60!
2951
      code = TSDB_CODE_MND_INVALID_TOPIC_OPTION;
×
2952
      mError("topic:%s, create ast error", pTopic->name);
×
2953
      sdbRelease(pSdb, pTopic);
×
2954
      sdbCancelFetch(pSdb, pIter);
×
2955
      TAOS_RETURN(code);
×
2956
    }
2957

2958
    SNodeList *pNodeList = NULL;
60✔
2959
    if ((code = nodesCollectColumns((SSelectStmt *)pAst, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pNodeList)) !=
60!
2960
        0) {
2961
      sdbRelease(pSdb, pTopic);
×
2962
      sdbCancelFetch(pSdb, pIter);
×
2963
      TAOS_RETURN(code);
×
2964
    }
2965
    SNode *pNode = NULL;
60✔
2966
    FOREACH(pNode, pNodeList) {
60✔
2967
      SColumnNode *pCol = (SColumnNode *)pNode;
46✔
2968

2969
      if (pCol->tableId == suid) {
46!
2970
        sdbRelease(pSdb, pTopic);
×
2971
        nodesDestroyNode(pAst);
×
2972
        nodesDestroyList(pNodeList);
×
2973
        sdbCancelFetch(pSdb, pIter);
×
2974
        TAOS_RETURN(-1);
×
2975
      } else {
2976
        goto NEXT;
46✔
2977
      }
2978
    }
2979
  NEXT:
14✔
2980
    sdbRelease(pSdb, pTopic);
60✔
2981
    nodesDestroyNode(pAst);
60✔
2982
    nodesDestroyList(pNodeList);
60✔
2983
  }
2984
  TAOS_RETURN(code);
1,351✔
2985
}
2986

2987
static int32_t mndCheckDropStbForStream(SMnode *pMnode, const char *stbFullName, int64_t suid) {
1,351✔
2988
  int32_t code = 0;
1,351✔
2989
  SSdb   *pSdb = pMnode->pSdb;
1,351✔
2990
  void   *pIter = NULL;
1,351✔
2991
  while (1) {
43✔
2992
    SStreamObj *pStream = NULL;
1,394✔
2993
    pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
1,394✔
2994
    if (pIter == NULL) break;
1,394✔
2995

2996
    if (pStream->targetStbUid == suid) {
47!
2997
      sdbCancelFetch(pSdb, pIter);
×
2998
      sdbRelease(pSdb, pStream);
×
2999
      TAOS_RETURN(-1);
4✔
3000
    }
3001

3002
    SNode *pAst = NULL;
47✔
3003
    if (nodesStringToNode(pStream->ast, &pAst) != 0) {
47!
3004
      code = TSDB_CODE_MND_INVALID_STREAM_OPTION;
×
3005
      mError("stream:%s, create ast error", pStream->name);
×
3006
      sdbCancelFetch(pSdb, pIter);
×
3007
      sdbRelease(pSdb, pStream);
×
3008
      TAOS_RETURN(code);
×
3009
    }
3010

3011
    SNodeList *pNodeList = NULL;
47✔
3012
    if ((code = nodesCollectColumns((SSelectStmt *)pAst, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pNodeList)) !=
47!
3013
        0) {
3014
      sdbCancelFetch(pSdb, pIter);
×
3015
      sdbRelease(pSdb, pStream);
×
3016
      TAOS_RETURN(code);
×
3017
    }
3018
    SNode *pNode = NULL;
47✔
3019
    FOREACH(pNode, pNodeList) {
47!
3020
      SColumnNode *pCol = (SColumnNode *)pNode;
47✔
3021

3022
      if (pCol->tableId == suid) {
47✔
3023
        sdbCancelFetch(pSdb, pIter);
4✔
3024
        sdbRelease(pSdb, pStream);
4✔
3025
        nodesDestroyNode(pAst);
4✔
3026
        nodesDestroyList(pNodeList);
4✔
3027
        TAOS_RETURN(-1);
4✔
3028
      } else {
3029
        goto NEXT;
43✔
3030
      }
3031
    }
3032
  NEXT:
×
3033
    sdbRelease(pSdb, pStream);
43✔
3034
    nodesDestroyNode(pAst);
43✔
3035
    nodesDestroyList(pNodeList);
43✔
3036
  }
3037
  TAOS_RETURN(code);
1,347✔
3038
}
3039

3040
static int32_t mndProcessDropTtltbRsp(SRpcMsg *pRsp) { return 0; }
×
3041
static int32_t mndProcessTrimDbRsp(SRpcMsg *pRsp) { return 0; }
103✔
3042
static int32_t mndProcessS3MigrateDbRsp(SRpcMsg *pRsp) { return 0; }
×
3043

3044
static int32_t mndProcessDropStbReq(SRpcMsg *pReq) {
2,001✔
3045
  SMnode      *pMnode = pReq->info.node;
2,001✔
3046
  int32_t      code = -1;
2,001✔
3047
  SDbObj      *pDb = NULL;
2,001✔
3048
  SStbObj     *pStb = NULL;
2,001✔
3049
  SMDropStbReq dropReq = {0};
2,001✔
3050

3051
  TAOS_CHECK_GOTO(tDeserializeSMDropStbReq(pReq->pCont, pReq->contLen, &dropReq), NULL, _OVER);
2,001!
3052

3053
  mInfo("stb:%s, start to drop", dropReq.name);
2,001!
3054

3055
  pStb = mndAcquireStb(pMnode, dropReq.name);
2,001✔
3056
  if (pStb == NULL) {
2,001✔
3057
    if (dropReq.igNotExists) {
650✔
3058
      mInfo("stb:%s, not exist, ignore not exist is set", dropReq.name);
647!
3059
      code = 0;
647✔
3060
      goto _OVER;
647✔
3061
    } else {
3062
      code = TSDB_CODE_MND_STB_NOT_EXIST;
3✔
3063
      goto _OVER;
3✔
3064
    }
3065
  }
3066

3067
  if ((dropReq.source == TD_REQ_FROM_TAOX_OLD || dropReq.source == TD_REQ_FROM_TAOX) && pStb->uid != dropReq.suid) {
1,351!
3068
    code = 0;
×
3069
    goto _OVER;
×
3070
  }
3071

3072
  pDb = mndAcquireDbByStb(pMnode, dropReq.name);
1,351✔
3073
  if (pDb == NULL) {
1,351!
3074
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
3075
    goto _OVER;
×
3076
  }
3077

3078
  if ((code = mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_WRITE_DB, pDb)) != 0) {
1,351!
3079
    goto _OVER;
×
3080
  }
3081

3082
  if (mndCheckDropStbForTopic(pMnode, dropReq.name, pStb->uid) < 0) {
1,351!
3083
    code = TSDB_CODE_MND_TOPIC_MUST_BE_DELETED;
×
3084
    goto _OVER;
×
3085
  }
3086

3087
  if (mndCheckDropStbForStream(pMnode, dropReq.name, pStb->uid) < 0) {
1,351✔
3088
    code = TSDB_CODE_MND_STREAM_MUST_BE_DELETED;
4✔
3089
    goto _OVER;
4✔
3090
  }
3091

3092
  code = mndDropStb(pMnode, pReq, pDb, pStb);
1,347✔
3093
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
1,347!
3094

3095
  SName   name = {0};
1,347✔
3096
  int32_t ret = 0;
1,347✔
3097
  if ((ret = tNameFromString(&name, dropReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0)
1,347!
3098
    mError("stb:%s, failed to tNameFromString since %s", dropReq.name, tstrerror(ret));
×
3099

3100
  auditRecord(pReq, pMnode->clusterId, "dropStb", name.dbname, name.tname, dropReq.sql, dropReq.sqlLen);
1,347✔
3101

3102
_OVER:
2,001✔
3103
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
2,001✔
3104
    mError("stb:%s, failed to drop since %s", dropReq.name, tstrerror(code));
7!
3105
  }
3106

3107
  mndReleaseDb(pMnode, pDb);
2,001✔
3108
  mndReleaseStb(pMnode, pStb);
2,001✔
3109
  tFreeSMDropStbReq(&dropReq);
2,001✔
3110
  TAOS_RETURN(code);
2,001✔
3111
}
3112

3113
static int32_t mndProcessTableMetaReq(SRpcMsg *pReq) {
1,777,843✔
3114
  SMnode       *pMnode = pReq->info.node;
1,777,843✔
3115
  int32_t       code = -1;
1,777,843✔
3116
  STableInfoReq infoReq = {0};
1,777,843✔
3117
  STableMetaRsp metaRsp = {0};
1,777,843✔
3118
  SUserObj     *pUser = NULL;
1,777,843✔
3119

3120
  code = mndAcquireUser(pMnode, pReq->info.conn.user, &pUser);
1,777,843✔
3121
  if (pUser == NULL) return 0;
1,777,998!
3122
  bool sysinfo = pUser->sysInfo;
1,777,998✔
3123

3124
  TAOS_CHECK_GOTO(tDeserializeSTableInfoReq(pReq->pCont, pReq->contLen, &infoReq), NULL, _OVER);
1,777,998!
3125

3126
  if (0 == strcmp(infoReq.dbFName, TSDB_INFORMATION_SCHEMA_DB)) {
1,778,005✔
3127
    mInfo("information_schema table:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
229,854!
3128
    TAOS_CHECK_GOTO(mndBuildInsTableSchema(pMnode, infoReq.dbFName, infoReq.tbName, sysinfo, &metaRsp), NULL, _OVER);
229,854✔
3129
  } else if (0 == strcmp(infoReq.dbFName, TSDB_PERFORMANCE_SCHEMA_DB)) {
1,548,151✔
3130
    mInfo("performance_schema table:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
54,412!
3131
    TAOS_CHECK_GOTO(mndBuildPerfsTableSchema(pMnode, infoReq.dbFName, infoReq.tbName, &metaRsp), NULL, _OVER);
54,412✔
3132
  } else {
3133
    mInfo("stb:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
1,493,739✔
3134
    TAOS_CHECK_GOTO(mndBuildStbSchema(pMnode, infoReq.dbFName, infoReq.tbName, &metaRsp), NULL, _OVER);
1,493,789✔
3135
  }
3136

3137
  int32_t rspLen = tSerializeSTableMetaRsp(NULL, 0, &metaRsp);
1,774,701✔
3138
  if (rspLen < 0) {
1,774,659!
3139
    code = TSDB_CODE_INVALID_MSG;
×
3140
    goto _OVER;
×
3141
  }
3142

3143
  void *pRsp = rpcMallocCont(rspLen);
1,774,659✔
3144
  if (pRsp == NULL) {
1,774,568!
3145
    code = terrno;
×
3146
    goto _OVER;
×
3147
  }
3148

3149
  if ((rspLen = tSerializeSTableMetaRsp(pRsp, rspLen, &metaRsp)) < 0) {
1,774,568!
3150
    code = rspLen;
×
3151
    goto _OVER;
×
3152
  }
3153
  pReq->info.rsp = pRsp;
1,774,676✔
3154
  pReq->info.rspLen = rspLen;
1,774,676✔
3155
  code = 0;
1,774,676✔
3156

3157
  mTrace("%s.%s, meta is retrieved", infoReq.dbFName, infoReq.tbName);
1,774,676✔
3158

3159
_OVER:
1,770,278✔
3160
  if (code != 0) {
1,778,007✔
3161
    mError("stb:%s.%s, failed to retrieve meta since %s", infoReq.dbFName, infoReq.tbName, tstrerror(code));
3,331!
3162
  }
3163

3164
  mndReleaseUser(pMnode, pUser);
1,778,007✔
3165
  tFreeSTableMetaRsp(&metaRsp);
1,778,032✔
3166
  // TODO change to TAOS_RETURN
3167
  return code;
1,778,025✔
3168
}
3169

3170
static int32_t mndProcessTableCfgReq(SRpcMsg *pReq) {
96✔
3171
  SMnode      *pMnode = pReq->info.node;
96✔
3172
  int32_t      code = -1;
96✔
3173
  STableCfgReq cfgReq = {0};
96✔
3174
  STableCfgRsp cfgRsp = {0};
96✔
3175

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

3178
  char dbName[TSDB_DB_NAME_LEN] = {0};
96✔
3179
  TAOS_CHECK_GOTO(mndExtractShortDbNameFromDbFullName(cfgReq.dbFName, dbName), NULL, _OVER);
96!
3180
  if (0 == strcmp(dbName, TSDB_INFORMATION_SCHEMA_DB)) {
96✔
3181
    mInfo("information_schema table:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
20!
3182
    TAOS_CHECK_GOTO(mndBuildInsTableCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
20!
3183
  } else if (0 == strcmp(dbName, TSDB_PERFORMANCE_SCHEMA_DB)) {
76✔
3184
    mInfo("performance_schema table:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
10!
3185
    TAOS_CHECK_GOTO(mndBuildPerfsTableCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
10!
3186
  } else {
3187
    mInfo("stb:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
66!
3188
    TAOS_CHECK_GOTO(mndBuildStbCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
66!
3189
  }
3190

3191
  int32_t rspLen = tSerializeSTableCfgRsp(NULL, 0, &cfgRsp);
96✔
3192
  if (rspLen < 0) {
96!
3193
    code = TSDB_CODE_INVALID_MSG;
×
3194
    goto _OVER;
×
3195
  }
3196

3197
  void *pRsp = rpcMallocCont(rspLen);
96✔
3198
  if (pRsp == NULL) {
96!
3199
    code = terrno;
×
3200
    goto _OVER;
×
3201
  }
3202

3203
  if ((rspLen = tSerializeSTableCfgRsp(pRsp, rspLen, &cfgRsp)) < 0) {
96!
3204
    code = rspLen;
×
3205
    goto _OVER;
×
3206
  }
3207
  pReq->info.rsp = pRsp;
96✔
3208
  pReq->info.rspLen = rspLen;
96✔
3209
  code = 0;
96✔
3210

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

3213
_OVER:
81✔
3214
  if (code != 0) {
96!
3215
    mError("stb:%s.%s, failed to retrieve cfg since %s", cfgReq.dbFName, cfgReq.tbName, tstrerror(code));
×
3216
  }
3217

3218
  tFreeSTableCfgRsp(&cfgRsp);
96✔
3219
  TAOS_RETURN(code);
96✔
3220
}
3221

3222
int32_t mndValidateStbInfo(SMnode *pMnode, SSTableVersion *pStbVersions, int32_t numOfStbs, void **ppRsp,
24,505✔
3223
                           int32_t *pRspLen) {
3224
  int32_t   code = 0;
24,505✔
3225
  SSTbHbRsp hbRsp = {0};
24,505✔
3226
  hbRsp.pMetaRsp = taosArrayInit(numOfStbs, sizeof(STableMetaRsp));
24,505✔
3227
  if (hbRsp.pMetaRsp == NULL) {
24,505!
3228
    code = terrno;
×
3229
    TAOS_RETURN(code);
×
3230
  }
3231

3232
  hbRsp.pIndexRsp = taosArrayInit(numOfStbs, sizeof(STableIndexRsp));
24,505✔
3233
  if (NULL == hbRsp.pIndexRsp) {
24,505!
3234
    taosArrayDestroy(hbRsp.pMetaRsp);
×
3235
    code = terrno;
×
3236
    TAOS_RETURN(code);
×
3237
  }
3238

3239
  for (int32_t i = 0; i < numOfStbs; ++i) {
55,365✔
3240
    SSTableVersion *pStbVersion = &pStbVersions[i];
30,860✔
3241
    pStbVersion->suid = be64toh(pStbVersion->suid);
30,860✔
3242
    pStbVersion->sversion = ntohl(pStbVersion->sversion);
30,860✔
3243
    pStbVersion->tversion = ntohl(pStbVersion->tversion);
30,860✔
3244
    pStbVersion->smaVer = ntohl(pStbVersion->smaVer);
30,860✔
3245

3246
    bool    schema = false;
30,860✔
3247
    bool    sma = false;
30,860✔
3248
    int32_t code = mndValidateStbVersion(pMnode, pStbVersion, &schema, &sma);
30,860✔
3249
    if (TSDB_CODE_SUCCESS != code) {
30,860✔
3250
      STableMetaRsp metaRsp = {0};
820✔
3251
      metaRsp.numOfColumns = -1;
820✔
3252
      metaRsp.suid = pStbVersion->suid;
820✔
3253
      tstrncpy(metaRsp.dbFName, pStbVersion->dbFName, sizeof(metaRsp.dbFName));
820✔
3254
      tstrncpy(metaRsp.tbName, pStbVersion->stbName, sizeof(metaRsp.tbName));
820✔
3255
      tstrncpy(metaRsp.stbName, pStbVersion->stbName, sizeof(metaRsp.stbName));
820✔
3256
      if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
1,640!
3257
        code = terrno;
×
3258
        return code;
×
3259
      }
3260
      continue;
820✔
3261
    }
3262

3263
    if (schema) {
30,040✔
3264
      STableMetaRsp metaRsp = {0};
335✔
3265
      mInfo("stb:%s.%s, start to retrieve meta", pStbVersion->dbFName, pStbVersion->stbName);
335!
3266
      if (mndBuildStbSchema(pMnode, pStbVersion->dbFName, pStbVersion->stbName, &metaRsp) != 0) {
335!
3267
        metaRsp.numOfColumns = -1;
×
3268
        metaRsp.suid = pStbVersion->suid;
×
3269
        tstrncpy(metaRsp.dbFName, pStbVersion->dbFName, sizeof(metaRsp.dbFName));
×
3270
        tstrncpy(metaRsp.tbName, pStbVersion->stbName, sizeof(metaRsp.tbName));
×
3271
        tstrncpy(metaRsp.stbName, pStbVersion->stbName, sizeof(metaRsp.stbName));
×
3272
        if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
×
3273
          code = terrno;
×
3274
          return code;
×
3275
        }
3276
        continue;
×
3277
      }
3278

3279
      if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
670!
3280
        code = terrno;
×
3281
        return code;
×
3282
      }
3283
    }
3284

3285
    if (sma) {
30,040!
3286
      bool           exist = false;
×
3287
      char           tbFName[TSDB_TABLE_FNAME_LEN];
3288
      STableIndexRsp indexRsp = {0};
×
3289
      indexRsp.pIndex = taosArrayInit(10, sizeof(STableIndexInfo));
×
3290
      if (NULL == indexRsp.pIndex) {
×
3291
        code = terrno;
×
3292
        TAOS_RETURN(code);
×
3293
      }
3294

3295
      (void)tsnprintf(tbFName, sizeof(tbFName), "%s.%s", pStbVersion->dbFName, pStbVersion->stbName);
×
3296
      int32_t code = mndGetTableSma(pMnode, tbFName, &indexRsp, &exist);
×
3297
      if (code || !exist) {
×
3298
        indexRsp.suid = pStbVersion->suid;
×
3299
        indexRsp.version = -1;
×
3300
        indexRsp.pIndex = NULL;
×
3301
      }
3302

3303
      tstrncpy(indexRsp.dbFName, pStbVersion->dbFName, sizeof(indexRsp.dbFName));
×
3304
      tstrncpy(indexRsp.tbName, pStbVersion->stbName, sizeof(indexRsp.tbName));
×
3305

3306
      if (taosArrayPush(hbRsp.pIndexRsp, &indexRsp) == NULL) {
×
3307
        code = terrno;
×
3308
        return code;
×
3309
      }
3310
    }
3311
  }
3312

3313
  int32_t rspLen = tSerializeSSTbHbRsp(NULL, 0, &hbRsp);
24,505✔
3314
  if (rspLen < 0) {
24,505!
3315
    tFreeSSTbHbRsp(&hbRsp);
×
3316
    code = TSDB_CODE_INVALID_MSG;
×
3317
    TAOS_RETURN(code);
×
3318
  }
3319

3320
  void *pRsp = taosMemoryMalloc(rspLen);
24,505!
3321
  if (pRsp == NULL) {
24,505!
3322
    tFreeSSTbHbRsp(&hbRsp);
×
3323
    code = terrno;
×
3324
    TAOS_RETURN(code);
×
3325
  }
3326

3327
  rspLen = tSerializeSSTbHbRsp(pRsp, rspLen, &hbRsp);
24,505✔
3328
  tFreeSSTbHbRsp(&hbRsp);
24,505✔
3329
  if (rspLen < 0) return rspLen;
24,505!
3330
  *ppRsp = pRsp;
24,505✔
3331
  *pRspLen = rspLen;
24,505✔
3332
  TAOS_RETURN(code);
24,505✔
3333
}
3334

3335
int32_t mndGetNumOfStbs(SMnode *pMnode, char *dbName, int32_t *pNumOfStbs) {
10,398✔
3336
  int32_t code = 0;
10,398✔
3337
  SSdb   *pSdb = pMnode->pSdb;
10,398✔
3338
  SDbObj *pDb = mndAcquireDb(pMnode, dbName);
10,398✔
3339
  if (pDb == NULL) {
10,398!
3340
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
3341
    TAOS_RETURN(code);
×
3342
  }
3343

3344
  int32_t numOfStbs = 0;
10,398✔
3345
  void   *pIter = NULL;
10,398✔
3346
  while (1) {
195,995✔
3347
    SStbObj *pStb = NULL;
206,393✔
3348
    pIter = sdbFetch(pSdb, SDB_STB, pIter, (void **)&pStb);
206,393✔
3349
    if (pIter == NULL) break;
206,393✔
3350

3351
    if (pStb->dbUid == pDb->uid) {
195,995✔
3352
      numOfStbs++;
90,782✔
3353
    }
3354

3355
    sdbRelease(pSdb, pStb);
195,995✔
3356
  }
3357

3358
  *pNumOfStbs = numOfStbs;
10,398✔
3359
  mndReleaseDb(pMnode, pDb);
10,398✔
3360
  TAOS_RETURN(code);
10,398✔
3361
}
3362

3363
int32_t mndExtractDbNameFromStbFullName(const char *stbFullName, char *dst) {
×
3364
  SName name = {0};
×
3365
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
×
3366

3367
  TAOS_CHECK_RETURN(tNameGetFullDbName(&name, dst));
×
3368

3369
  return 0;
×
3370
}
3371

3372
int32_t mndExtractShortDbNameFromStbFullName(const char *stbFullName, char *dst) {
4✔
3373
  SName name = {0};
4✔
3374
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
4!
3375

3376
  TAOS_CHECK_RETURN(tNameGetDbName(&name, dst));
4!
3377

3378
  return 0;
4✔
3379
}
3380

3381
int32_t mndExtractShortDbNameFromDbFullName(const char *stbFullName, char *dst) {
96✔
3382
  SName name = {0};
96✔
3383
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB));
96!
3384

3385
  TAOS_CHECK_RETURN(tNameGetDbName(&name, dst));
96!
3386

3387
  return 0;
96✔
3388
}
3389

3390
void mndExtractTbNameFromStbFullName(const char *stbFullName, char *dst, int32_t dstSize) {
1,883,320✔
3391
  int32_t pos = -1;
1,883,320✔
3392
  int32_t num = 0;
1,883,320✔
3393
  for (pos = 0; stbFullName[pos] != 0; ++pos) {
33,347,385!
3394
    if (stbFullName[pos] == TS_PATH_DELIMITER[0]) num++;
33,347,527✔
3395
    if (num == 2) break;
33,347,527✔
3396
  }
3397

3398
  if (num == 2) {
1,883,320!
3399
    tstrncpy(dst, stbFullName + pos + 1, dstSize);
1,883,413✔
3400
  }
3401
}
1,883,320✔
3402

3403
static int32_t mndRetrieveStb(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
19,948✔
3404
  SMnode  *pMnode = pReq->info.node;
19,948✔
3405
  SSdb    *pSdb = pMnode->pSdb;
19,948✔
3406
  int32_t  numOfRows = 0;
19,948✔
3407
  SStbObj *pStb = NULL;
19,948✔
3408
  int32_t  cols = 0;
19,948✔
3409
  int32_t  lino = 0;
19,948✔
3410
  int32_t  code = 0;
19,948✔
3411

3412
  SDbObj *pDb = NULL;
19,948✔
3413
  if (strlen(pShow->db) > 0) {
19,948✔
3414
    pDb = mndAcquireDb(pMnode, pShow->db);
1,087✔
3415
    if (pDb == NULL) return terrno;
1,087✔
3416
  }
3417

3418
  while (numOfRows < rows) {
1,079,822✔
3419
    pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb);
1,070,430✔
3420
    if (pShow->pIter == NULL) break;
1,070,250✔
3421

3422
    if (pDb != NULL && pStb->dbUid != pDb->uid) {
1,059,675✔
3423
      sdbRelease(pSdb, pStb);
2,066✔
3424
      continue;
2,078✔
3425
    }
3426

3427
    if (isTsmaResSTb(pStb->name)) {
1,057,609✔
3428
      sdbRelease(pSdb, pStb);
12✔
3429
      continue;
12✔
3430
    }
3431

3432
    cols = 0;
1,057,491✔
3433

3434
    SName name = {0};
1,057,491✔
3435

3436
    char stbName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,057,491✔
3437
    mndExtractTbNameFromStbFullName(pStb->name, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN);
1,057,491✔
3438
    varDataSetLen(stbName, strlen(&stbName[VARSTR_HEADER_SIZE]));
1,057,615✔
3439
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,057,615✔
3440
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stbName, false), pStb, &lino, _ERROR);
1,054,174!
3441

3442
    char db[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,049,914✔
3443
    RETRIEVE_CHECK_GOTO(tNameFromString(&name, pStb->db, T_NAME_ACCT | T_NAME_DB), pStb, &lino, _ERROR);
1,049,914!
3444
    RETRIEVE_CHECK_GOTO(tNameGetDbName(&name, varDataVal(db)), pStb, &lino, _ERROR);
1,056,885!
3445
    varDataSetLen(db, strlen(varDataVal(db)));
1,057,017✔
3446
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,057,017✔
3447
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)db, false), pStb, &lino, _ERROR);
1,052,798!
3448

3449
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,046,560✔
3450
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->createdTime, false), pStb, &lino,
1,043,285!
3451
                        _ERROR);
3452

3453
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,040,961✔
3454
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->numOfColumns, false), pStb, &lino,
1,037,840!
3455
                        _ERROR);
3456

3457
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,038,939✔
3458
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->numOfTags, false), pStb, &lino, _ERROR);
1,036,134!
3459

3460
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,037,856✔
3461
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->updateTime, false), pStb, &lino,
1,035,084!
3462
                        _ERROR);  // number of tables
3463

3464
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,037,289✔
3465
    if (pStb->commentLen > 0) {
1,034,664!
UNCOV
3466
      char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
×
UNCOV
3467
      STR_TO_VARSTR(comment, pStb->comment);
×
UNCOV
3468
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, comment, false), pStb, &lino, _ERROR);
×
3469
    } else if (pStb->commentLen == 0) {
1,035,923✔
3470
      char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
28,081✔
3471
      STR_TO_VARSTR(comment, "");
28,081✔
3472
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, comment, false), pStb, &lino, _ERROR);
28,081!
3473
    } else {
3474
      colDataSetNULL(pColInfo, numOfRows);
1,007,842!
3475
    }
3476

3477
    char watermark[64 + VARSTR_HEADER_SIZE] = {0};
1,036,034✔
3478
    (void)tsnprintf(varDataVal(watermark), sizeof(watermark) - VARSTR_HEADER_SIZE, "%" PRId64 "a,%" PRId64 "a",
1,036,034✔
3479
              pStb->watermark[0], pStb->watermark[1]);
1,036,034✔
3480
    varDataSetLen(watermark, strlen(varDataVal(watermark)));
1,057,279✔
3481

3482
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,057,279✔
3483
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)watermark, false), pStb, &lino, _ERROR);
1,050,791!
3484

3485
    char maxDelay[64 + VARSTR_HEADER_SIZE] = {0};
1,045,823✔
3486
    (void)tsnprintf(varDataVal(maxDelay), sizeof(maxDelay) - VARSTR_HEADER_SIZE, "%" PRId64 "a,%" PRId64 "a",
1,045,823✔
3487
              pStb->maxdelay[0], pStb->maxdelay[1]);
1,045,823✔
3488
    varDataSetLen(maxDelay, strlen(varDataVal(maxDelay)));
1,056,915✔
3489

3490
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,056,915✔
3491
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)maxDelay, false), pStb, &lino, _ERROR);
1,050,909!
3492

3493
    char    rollup[160 + VARSTR_HEADER_SIZE] = {0};
1,045,289✔
3494
    int32_t rollupNum = (int32_t)taosArrayGetSize(pStb->pFuncs);
1,045,289✔
3495
    char   *sep = ", ";
1,050,215✔
3496
    int32_t sepLen = strlen(sep);
1,050,215✔
3497
    int32_t rollupLen = sizeof(rollup) - VARSTR_HEADER_SIZE - 2;
1,050,215✔
3498
    for (int32_t i = 0; i < rollupNum; ++i) {
1,050,219✔
3499
      char *funcName = taosArrayGet(pStb->pFuncs, i);
4✔
3500
      if (i) {
4!
3501
        (void)strncat(varDataVal(rollup), sep, rollupLen);
×
3502
        rollupLen -= sepLen;
×
3503
      }
3504
      (void)strncat(varDataVal(rollup), funcName, rollupLen);
4✔
3505
      rollupLen -= strlen(funcName);
4✔
3506
    }
3507
    varDataSetLen(rollup, strlen(varDataVal(rollup)));
1,050,215✔
3508

3509
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,050,215✔
3510
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)rollup, false), pStb, &lino, _ERROR);
1,050,525!
3511

3512
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,043,567✔
3513
    if (pColInfo) {
1,039,084!
3514
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->uid), false), pStb, &lino, _ERROR);
1,039,106!
3515
    }
3516

3517
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,036,793✔
3518
    if (pColInfo) {
1,033,239!
3519
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->virtualStb), false), pStb, &lino, _ERROR);
1,033,284!
3520
    }
3521

3522
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,036,164✔
3523
    if (pColInfo) {
1,032,596!
3524
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->keep), false), pStb, &lino, _ERROR);
1,032,621!
3525
    }
3526

3527
    numOfRows++;
1,035,187✔
3528
    sdbRelease(pSdb, pStb);
1,035,187✔
3529
  }
3530

3531
  if (pDb != NULL) {
19,967✔
3532
    mndReleaseDb(pMnode, pDb);
1,080✔
3533
  }
3534

3535
  goto _OVER;
19,949✔
3536

3537
_ERROR:
×
3538
  mError("show:0x%" PRIx64 ", failed to retrieve data at %s:%d since %s", pShow->id, __FUNCTION__, lino,
×
3539
         tstrerror(code));
3540

3541
_OVER:
×
3542
  pShow->numOfRows += numOfRows;
19,949✔
3543
  return numOfRows;
19,949✔
3544
}
3545

3546
static int32_t buildDbColsInfoBlock(const SSDataBlock *p, const SSysTableMeta *pSysDbTableMeta, size_t size,
28,305✔
3547
                                    const char *dbName, const char *tbName) {
3548
  char    tName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
28,305✔
3549
  char    dName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
28,305✔
3550
  char    typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
28,305✔
3551
  int32_t numOfRows = p->info.rows;
28,305✔
3552
  int32_t lino = 0;
28,305✔
3553
  int32_t code = 0;
28,305✔
3554

3555
  STR_TO_VARSTR(dName, dbName);
28,305✔
3556
  STR_TO_VARSTR(typeName, "SYSTEM_TABLE");
28,305✔
3557

3558
  for (int32_t i = 0; i < size; ++i) {
612,201!
3559
    const SSysTableMeta *pm = &pSysDbTableMeta[i];
622,427✔
3560
    //    if (pm->sysInfo) {
3561
    //      continue;
3562
    //    }
3563
    if (tbName[0] && strncmp(tbName, pm->name, TSDB_TABLE_NAME_LEN) != 0) {
622,427!
3564
      continue;
×
3565
    }
3566

3567
    STR_TO_VARSTR(tName, pm->name);
622,427✔
3568

3569
    for (int32_t j = 0; j < pm->colNum; j++) {
6,141,768✔
3570
      // table name
3571
      SColumnInfoData *pColInfoData = taosArrayGet(p->pDataBlock, 0);
5,557,872✔
3572
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, tName, false), &lino, _OVER);
5,547,568!
3573

3574
      // database name
3575
      pColInfoData = taosArrayGet(p->pDataBlock, 1);
5,534,757✔
3576
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, dName, false), &lino, _OVER);
5,525,888!
3577

3578
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
5,530,113✔
3579
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, typeName, false), &lino, _OVER);
5,522,573!
3580

3581
      // col name
3582
      char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
5,532,526✔
3583
      STR_TO_VARSTR(colName, pm->schema[j].name);
5,532,526✔
3584
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
5,532,526✔
3585
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, colName, false), &lino, _OVER);
5,564,071!
3586

3587
      // col type
3588
      int8_t colType = pm->schema[j].type;
5,543,643✔
3589
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
5,543,643✔
3590
      char colTypeStr[VARSTR_HEADER_SIZE + 32];
3591
      int  colTypeLen =
5,589,266✔
3592
          tsnprintf(varDataVal(colTypeStr), sizeof(colTypeStr) - VARSTR_HEADER_SIZE, "%s", tDataTypes[colType].name);
5,536,104✔
3593
      if (colType == TSDB_DATA_TYPE_VARCHAR) {
5,589,266✔
3594
        colTypeLen +=
3,056,528✔
3595
            tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d)",
3,056,363✔
3596
                      (int32_t)(pm->schema[j].bytes - VARSTR_HEADER_SIZE));
3,056,363✔
3597
      } else if (colType == TSDB_DATA_TYPE_NCHAR) {
2,532,903!
3598
        colTypeLen +=
×
3599
            tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d)",
×
3600
                      (int32_t)((pm->schema[j].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
×
3601
      }
3602
      varDataSetLen(colTypeStr, colTypeLen);
5,589,431✔
3603
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, (char *)colTypeStr, false), &lino, _OVER);
5,589,431!
3604

3605
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
5,549,127✔
3606
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, (const char *)&pm->schema[j].bytes, false), &lino, _OVER);
5,542,034!
3607
      for (int32_t k = 6; k <= 9; ++k) {
27,497,894✔
3608
        pColInfoData = taosArrayGet(p->pDataBlock, k);
21,978,553✔
3609
        colDataSetNULL(pColInfoData, numOfRows);
21,960,127✔
3610
      }
3611

3612
      numOfRows += 1;
5,519,341✔
3613
    }
3614
  }
UNCOV
3615
  return numOfRows;
×
3616
_OVER:
×
3617
  mError("failed at %s:%d since %s", __FUNCTION__, lino, tstrerror(code));
×
3618
  return numOfRows;
×
3619
}
3620
#define BUILD_COL_FOR_INFO_DB 1
3621
#define BUILD_COL_FOR_PERF_DB 1 << 1
3622
#define BUILD_COL_FOR_USER_DB 1 << 2
3623
#define BUILD_COL_FOR_ALL_DB  (BUILD_COL_FOR_INFO_DB | BUILD_COL_FOR_PERF_DB | BUILD_COL_FOR_USER_DB)
3624

3625
static int32_t buildSysDbColsInfo(SSDataBlock *p, int8_t buildWhichDBs, char *tb) {
14,160✔
3626
  size_t               size = 0;
14,160✔
3627
  const SSysTableMeta *pSysDbTableMeta = NULL;
14,160✔
3628

3629
  if (buildWhichDBs & BUILD_COL_FOR_INFO_DB) {
14,160✔
3630
    getInfosDbMeta(&pSysDbTableMeta, &size);
14,153✔
3631
    p->info.rows = buildDbColsInfoBlock(p, pSysDbTableMeta, size, TSDB_INFORMATION_SCHEMA_DB, tb);
14,153✔
3632
  }
3633

3634
  if (buildWhichDBs & BUILD_COL_FOR_PERF_DB) {
14,159✔
3635
    getPerfDbMeta(&pSysDbTableMeta, &size);
14,152✔
3636
    p->info.rows = buildDbColsInfoBlock(p, pSysDbTableMeta, size, TSDB_PERFORMANCE_SCHEMA_DB, tb);
14,153✔
3637
  }
3638

3639
  return p->info.rows;
14,160✔
3640
}
3641

3642
static int8_t determineBuildColForWhichDBs(const char *db) {
14,184✔
3643
  int8_t buildWhichDBs;
3644
  if (!db[0])
14,184✔
3645
    buildWhichDBs = BUILD_COL_FOR_ALL_DB;
14,152✔
3646
  else {
3647
    char *p = strchr(db, '.');
32✔
3648
    if (p && strcmp(p + 1, TSDB_INFORMATION_SCHEMA_DB) == 0) {
32!
3649
      buildWhichDBs = BUILD_COL_FOR_INFO_DB;
1✔
3650
    } else if (p && strcmp(p + 1, TSDB_PERFORMANCE_SCHEMA_DB) == 0) {
31!
3651
      buildWhichDBs = BUILD_COL_FOR_PERF_DB;
1✔
3652
    } else {
3653
      buildWhichDBs = BUILD_COL_FOR_USER_DB;
30✔
3654
    }
3655
  }
3656
  return buildWhichDBs;
14,184✔
3657
}
3658

3659
static int32_t mndRetrieveStbCol(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
14,184✔
3660
  uint8_t  buildWhichDBs;
3661
  SMnode  *pMnode = pReq->info.node;
14,184✔
3662
  SSdb    *pSdb = pMnode->pSdb;
14,184✔
3663
  SStbObj *pStb = NULL;
14,184✔
3664
  int32_t  numOfRows = 0;
14,184✔
3665
  int32_t  lino = 0;
14,184✔
3666
  int32_t  code = 0;
14,184✔
3667

3668
  buildWhichDBs = determineBuildColForWhichDBs(pShow->db);
14,184✔
3669

3670
  if (!pShow->sysDbRsp) {
14,184✔
3671
    numOfRows = buildSysDbColsInfo(pBlock, buildWhichDBs, pShow->filterTb);
14,160✔
3672
    mDebug("mndRetrieveStbCol get system table cols, rows:%d, db:%s", numOfRows, pShow->db);
14,160✔
3673
    pShow->sysDbRsp = true;
14,160✔
3674
  }
3675

3676
  if (buildWhichDBs & BUILD_COL_FOR_USER_DB) {
14,184✔
3677
    SDbObj *pDb = NULL;
14,182✔
3678
    if (strlen(pShow->db) > 0) {
14,182✔
3679
      pDb = mndAcquireDb(pMnode, pShow->db);
30✔
3680
      if (pDb == NULL && TSDB_CODE_MND_DB_NOT_EXIST != terrno && pBlock->info.rows == 0) return terrno;
30!
3681
    }
3682

3683
    char typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
14,182✔
3684
    STR_TO_VARSTR(typeName, "SUPER_TABLE");
14,182✔
3685
    bool fetch = pShow->restore ? false : true;
14,182✔
3686
    pShow->restore = false;
14,182✔
3687
    while (numOfRows < rows) {
839,849✔
3688
      if (fetch) {
839,846✔
3689
        pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb);
839,822✔
3690
        if (pShow->pIter == NULL) break;
839,837✔
3691
      } else {
3692
        fetch = true;
24✔
3693
        void *pKey = taosHashGetKey(pShow->pIter, NULL);
24✔
3694
        pStb = sdbAcquire(pSdb, SDB_STB, pKey);
24✔
3695
        if (!pStb) continue;
36!
3696
      }
3697

3698
      if (pDb != NULL && pStb->dbUid != pDb->uid) {
825,679✔
3699
        sdbRelease(pSdb, pStb);
12✔
3700
        continue;
12✔
3701
      }
3702

3703
      SName name = {0};
825,667✔
3704
      char  stbName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
825,667✔
3705
      mndExtractTbNameFromStbFullName(pStb->name, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN);
825,667✔
3706
      if (pShow->filterTb[0] && strncmp(pShow->filterTb, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN) != 0) {
825,667!
3707
        sdbRelease(pSdb, pStb);
×
3708
        continue;
×
3709
      }
3710

3711
      if ((numOfRows + pStb->numOfColumns) > rows) {
825,667✔
3712
        pShow->restore = true;
24✔
3713
        if (numOfRows == 0) {
24!
3714
          mError("mndRetrieveStbCol failed to get stable cols since buf:%d less than result:%d, stable name:%s, db:%s",
×
3715
                 rows, pStb->numOfColumns, pStb->name, pStb->db);
3716
        }
3717
        sdbRelease(pSdb, pStb);
24✔
3718
        break;
24✔
3719
      }
3720

3721
      varDataSetLen(stbName, strlen(&stbName[VARSTR_HEADER_SIZE]));
825,643✔
3722

3723
      mDebug("mndRetrieveStbCol get stable cols, stable name:%s, db:%s", pStb->name, pStb->db);
825,643✔
3724

3725
      char db[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
825,643✔
3726
      RETRIEVE_CHECK_GOTO(tNameFromString(&name, pStb->db, T_NAME_ACCT | T_NAME_DB), pStb, &lino, _OVER);
825,643!
3727
      RETRIEVE_CHECK_GOTO(tNameGetDbName(&name, varDataVal(db)), pStb, &lino, _OVER);
825,615!
3728
      varDataSetLen(db, strlen(varDataVal(db)));
825,654✔
3729

3730
      for (int i = 0; i < pStb->numOfColumns; i++) {
19,177,034✔
3731
        int32_t          cols = 0;
19,119,477✔
3732
        SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
19,119,477✔
3733
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stbName, false), pStb, &lino, _OVER);
18,828,259!
3734

3735
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
19,069,091✔
3736
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)db, false), pStb, &lino, _OVER);
18,726,049!
3737

3738
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
18,979,292✔
3739
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, typeName, false), pStb, &lino, _OVER);
18,630,195!
3740

3741
        // col name
3742
        char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
18,935,098✔
3743
        STR_TO_VARSTR(colName, pStb->pColumns[i].name);
18,935,098✔
3744
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
18,935,098✔
3745
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, colName, false), pStb, &lino, _OVER);
18,972,156!
3746

3747
        // col type
3748
        int8_t colType = pStb->pColumns[i].type;
19,050,190✔
3749
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
19,050,190✔
3750
        char colTypeStr[VARSTR_HEADER_SIZE + 32];
3751
        int  colTypeLen =
19,589,621✔
3752
            tsnprintf(varDataVal(colTypeStr), sizeof(colTypeStr) - VARSTR_HEADER_SIZE, "%s", tDataTypes[colType].name);
18,714,554✔
3753
        if (colType == TSDB_DATA_TYPE_VARCHAR) {
19,589,621✔
3754
          colTypeLen +=
1,540,219✔
3755
              tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE,
1,540,229✔
3756
                        "(%d)", (int32_t)(pStb->pColumns[i].bytes - VARSTR_HEADER_SIZE));
1,540,229✔
3757
        } else if (colType == TSDB_DATA_TYPE_NCHAR) {
18,049,392✔
3758
          colTypeLen +=
1,554,758✔
3759
              tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE,
1,554,848✔
3760
                        "(%d)", (int32_t)((pStb->pColumns[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
1,554,848✔
3761
        } else if (IS_DECIMAL_TYPE(colType)) {
16,494,544!
3762
          STypeMod typeMod = pStb->pExtSchemas[i].typeMod;
4,093✔
3763
          uint8_t prec = 0, scale = 0;
4,093✔
3764
          decimalFromTypeMod(typeMod, &prec, &scale);
4,093✔
3765
          colTypeLen += sprintf(varDataVal(colTypeStr) + colTypeLen, "(%d,%d)", prec, scale);
×
3766
        }
3767
        varDataSetLen(colTypeStr, colTypeLen);
19,585,428✔
3768
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (char *)colTypeStr, false), pStb, &lino, _OVER);
19,585,428!
3769

3770
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
19,123,827✔
3771
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->pColumns[i].bytes, false), pStb,
18,758,833!
3772
                            &lino, _OVER);
3773
        while (cols < pShow->numOfColumns) {
90,334,452✔
3774
          pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
71,983,072✔
3775
          colDataSetNULL(pColInfo, numOfRows);
71,483,344✔
3776
        }
3777
        numOfRows++;
18,351,380✔
3778
      }
3779

3780
      sdbRelease(pSdb, pStb);
57,557✔
3781
    }
3782

3783
    if (pDb != NULL) {
14,185✔
3784
      mndReleaseDb(pMnode, pDb);
30✔
3785
    }
3786
  }
3787

3788
  mDebug("mndRetrieveStbCol success, rows:%d, pShow->numOfRows:%d", numOfRows, pShow->numOfRows);
14,184✔
3789
  goto _OVER;
14,184✔
3790

3791
_ERROR:
3792
  mError("failed to mndRetrieveStbCol, rows:%d, pShow->numOfRows:%d, at %s:%d since %s", numOfRows, pShow->numOfRows,
3793
         __FUNCTION__, lino, tstrerror(code));
3794

3795
_OVER:
14,184✔
3796
  pShow->numOfRows += numOfRows;
14,184✔
3797
  return numOfRows;
14,184✔
3798
}
3799

3800
static void mndCancelGetNextStb(SMnode *pMnode, void *pIter) {
1✔
3801
  SSdb *pSdb = pMnode->pSdb;
1✔
3802
  sdbCancelFetchByType(pSdb, pIter, SDB_STB);
1✔
3803
}
1✔
3804

3805
const char *mndGetStbStr(const char *src) {
35,335✔
3806
  char *posDb = strstr(src, TS_PATH_DELIMITER);
35,335✔
3807
  if (posDb != NULL) ++posDb;
35,335!
3808
  if (posDb == NULL) return src;
35,335!
3809

3810
  char *posStb = strstr(posDb, TS_PATH_DELIMITER);
35,335✔
3811
  if (posStb != NULL) ++posStb;
35,335!
3812
  if (posStb == NULL) return posDb;
35,335!
3813
  return posStb;
35,335✔
3814
}
3815

3816
static int32_t mndCheckIndexReq(SCreateTagIndexReq *pReq) {
×
3817
  // impl
3818
  return TSDB_CODE_SUCCESS;
×
3819
}
3820

3821
/*int32_t mndAddIndexImpl(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp, void *sql,
3822
                        int32_t len) {
3823
  // impl later
3824
  int32_t code = 0;
3825
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "create-stb-index");
3826
  if (pTrans == NULL) goto _OVER;
3827

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

3832
  if (mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb) != 0) goto _OVER;
3833
  if (mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb) != 0) goto _OVER;
3834
  if (mndSetAlterStbRedoActions2(pMnode, pTrans, pDb, pStb, sql, len) != 0) goto _OVER;
3835
  if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
3836

3837
  return code;
3838

3839
_OVER:
3840
  mndTransDrop(pTrans);
3841
  return code;
3842
}
3843
static int32_t mndAddIndex(SMnode *pMnode, SRpcMsg *pReq, SCreateTagIndexReq *tagIdxReq, SDbObj *pDb, SStbObj *pOld) {
3844
  bool    needRsp = true;
3845
  int32_t code = -1;
3846
  SField *pField0 = NULL;
3847

3848
  SStbObj  stbObj = {0};
3849
  SStbObj *pNew = &stbObj;
3850

3851
  taosRLockLatch(&pOld->lock);
3852
  memcpy(&stbObj, pOld, sizeof(SStbObj));
3853
  taosRUnLockLatch(&pOld->lock);
3854

3855
  stbObj.pColumns = NULL;
3856
  stbObj.pTags = NULL;
3857
  stbObj.updateTime = taosGetTimestampMs();
3858
  stbObj.lock = 0;
3859

3860
  int32_t tag = mndFindSuperTableTagIndex(pOld, tagIdxReq->colName);
3861
  if (tag < 0) {
3862
    terrno = TSDB_CODE_MND_TAG_NOT_EXIST;
3863
    return -1;
3864
  }
3865
  if (mndAllocStbSchemas(pOld, pNew) != 0) {
3866
    return -1;
3867
  }
3868

3869
  SSchema *pTag = pNew->pTags + tag;
3870
  if (IS_IDX_ON(pTag)) {
3871
    terrno = TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST;
3872
    return -1;
3873
  } else {
3874
    pTag->flags |= COL_IDX_ON;
3875
  }
3876
  pNew->tagVer++;
3877

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

3880
  return code;
3881
}
3882
static int32_t mndProcessCreateIndexReq(SRpcMsg *pReq) {
3883
  SMnode            *pMnode = pReq->info.node;
3884
  int32_t            code = -1;
3885
  SDbObj            *pDb = NULL;
3886
  SStbObj           *pStb = NULL;
3887
  SCreateTagIndexReq tagIdxReq = {0};
3888

3889
  if (tDeserializeSCreateTagIdxReq(pReq->pCont, pReq->contLen, &tagIdxReq) != 0) {
3890
    terrno = TSDB_CODE_INVALID_MSG;
3891
    goto _OVER;
3892
  }
3893

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

3896
  if (mndCheckIndexReq(&tagIdxReq) != TSDB_CODE_SUCCESS) {
3897
    goto _OVER;
3898
  }
3899

3900
  pDb = mndAcquireDbByStb(pMnode, tagIdxReq.dbFName);
3901
  if (pDb == NULL) {
3902
    terrno = TSDB_CODE_MND_DB_NOT_EXIST;
3903
    goto _OVER;
3904
  }
3905

3906
  pStb = mndAcquireStb(pMnode, tagIdxReq.stbName);
3907
  if (pStb == NULL) {
3908
    terrno = TSDB_CODE_MND_STB_NOT_EXIST;
3909
    goto _OVER;
3910
  }
3911
  if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_WRITE_DB, pDb) != 0) {
3912
    goto _OVER;
3913
  }
3914

3915
  code = mndAddIndex(pMnode, pReq, &tagIdxReq, pDb, pStb);
3916
  if (terrno == TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST || terrno == TSDB_CODE_MND_TAG_NOT_EXIST) {
3917
    return terrno;
3918
  } else {
3919
    if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
3920
  }
3921
_OVER:
3922
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
3923
    mError("stb:%s, failed to create index since %s", tagIdxReq.stbName, terrstr());
3924
  }
3925
  mndReleaseStb(pMnode, pStb);
3926
  mndReleaseDb(pMnode, pDb);
3927
  return code;
3928
}
3929
static int32_t mndProcessDropIndexReq(SRpcMsg *pReq) {
3930
  SMnode          *pMnode = pReq->info.node;
3931
  int32_t          code = -1;
3932
  SDbObj          *pDb = NULL;
3933
  SStbObj         *pStb = NULL;
3934
  SDropTagIndexReq dropReq = {0};
3935
  if (tDeserializeSDropTagIdxReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
3936
    terrno = TSDB_CODE_INVALID_MSG;
3937
    goto _OVER;
3938
  }
3939
  //
3940
  return TSDB_CODE_SUCCESS;
3941
_OVER:
3942
  return code;
3943
}*/
3944

3945
static int32_t mndProcessDropStbReqFromMNode(SRpcMsg *pReq) {
89✔
3946
  int32_t code = mndProcessDropStbReq(pReq);
89✔
3947
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
89!
3948
    pReq->info.rsp = rpcMallocCont(1);
×
3949
    pReq->info.rspLen = 1;
×
3950
    pReq->info.noResp = false;
×
3951
    pReq->code = code;
×
3952
  }
3953
  return code;
89✔
3954
}
3955

3956
typedef struct SVDropTbVgReqs {
3957
  SArray     *pBatchReqs;
3958
  SVgroupInfo info;
3959
} SVDropTbVgReqs;
3960

3961
typedef struct SMDropTbDbInfo {
3962
  SArray *dbVgInfos;
3963
  int32_t hashPrefix;
3964
  int32_t hashSuffix;
3965
  int32_t hashMethod;
3966
} SMDropTbDbInfo;
3967

3968
typedef struct SMDropTbTsmaInfo {
3969
  char           tsmaResTbDbFName[TSDB_DB_FNAME_LEN];
3970
  char           tsmaResTbNamePrefix[TSDB_TABLE_FNAME_LEN];
3971
  int32_t        suid;
3972
  SMDropTbDbInfo dbInfo;  // reference to DbInfo in pDbMap
3973
} SMDropTbTsmaInfo;
3974

3975
typedef struct SMDropTbTsmaInfos {
3976
  SArray *pTsmaInfos;  // SMDropTbTsmaInfo
3977
} SMDropTbTsmaInfos;
3978

3979
typedef struct SMndDropTbsWithTsmaCtx {
3980
  SHashObj *pVgMap;  // <vgId, SVDropTbVgReqs>
3981
} SMndDropTbsWithTsmaCtx;
3982

3983
static int32_t mndDropTbForSingleVg(SMnode *pMnode, SMndDropTbsWithTsmaCtx *pCtx, SArray *pTbs, int32_t vgId);
3984

3985
static void destroySVDropTbBatchReqs(void *p);
3986
static void mndDestroyDropTbsWithTsmaCtx(SMndDropTbsWithTsmaCtx *p) {
30✔
3987
  if (!p) return;
30!
3988

3989
  if (p->pVgMap) {
30!
3990
    void *pIter = taosHashIterate(p->pVgMap, NULL);
30✔
3991
    while (pIter) {
60✔
3992
      SVDropTbVgReqs *pReqs = pIter;
30✔
3993
      taosArrayDestroyEx(pReqs->pBatchReqs, destroySVDropTbBatchReqs);
30✔
3994
      pIter = taosHashIterate(p->pVgMap, pIter);
30✔
3995
    }
3996
    taosHashCleanup(p->pVgMap);
30✔
3997
  }
3998
  taosMemoryFree(p);
30!
3999
}
4000

4001
static int32_t mndInitDropTbsWithTsmaCtx(SMndDropTbsWithTsmaCtx **ppCtx) {
30✔
4002
  int32_t                 code = 0;
30✔
4003
  SMndDropTbsWithTsmaCtx *pCtx = taosMemoryCalloc(1, sizeof(SMndDropTbsWithTsmaCtx));
30!
4004
  if (!pCtx) return terrno;
30!
4005

4006
  pCtx->pVgMap = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_NO_LOCK);
30✔
4007
  if (!pCtx->pVgMap) {
30!
4008
    code = terrno;
×
4009
    goto _end;
×
4010
  }
4011

4012
  *ppCtx = pCtx;
30✔
4013
_end:
30✔
4014
  if (code) mndDestroyDropTbsWithTsmaCtx(pCtx);
30!
4015
  return code;
30✔
4016
}
4017

4018
static void *mndBuildVDropTbsReq(SMnode *pMnode, const SVgroupInfo *pVgInfo, const SVDropTbBatchReq *pReq,
80✔
4019
                                 int32_t *len) {
4020
  int32_t   contLen = 0;
80✔
4021
  int32_t   ret = 0;
80✔
4022
  SMsgHead *pHead = NULL;
80✔
4023
  SEncoder  encoder = {0};
80✔
4024

4025
  tEncodeSize(tEncodeSVDropTbBatchReq, pReq, contLen, ret);
80!
4026
  if (ret < 0) return NULL;
80!
4027

4028
  contLen += sizeof(SMsgHead);
80✔
4029
  pHead = taosMemoryMalloc(contLen);
80!
4030
  if (pHead == NULL) {
80!
4031
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
4032
    return NULL;
×
4033
  }
4034

4035
  pHead->contLen = htonl(contLen);
80✔
4036
  pHead->vgId = htonl(pVgInfo->vgId);
80✔
4037

4038
  void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
80✔
4039

4040
  tEncoderInit(&encoder, pBuf, contLen - sizeof(SMsgHead));
80✔
4041
  int32_t code = tEncodeSVDropTbBatchReq(&encoder, pReq);
80✔
4042
  tEncoderClear(&encoder);
80✔
4043
  if (code != 0) return NULL;
80!
4044

4045
  *len = contLen;
80✔
4046
  return pHead;
80✔
4047
}
4048

4049
static int32_t mndSetDropTbsRedoActions(SMnode *pMnode, STrans *pTrans, const SVDropTbVgReqs *pVgReqs, void *pCont,
80✔
4050
                                        int32_t contLen, tmsg_t msgType) {
4051
  STransAction action = {0};
80✔
4052
  action.epSet = pVgReqs->info.epSet;
80✔
4053
  action.pCont = pCont;
80✔
4054
  action.contLen = contLen;
80✔
4055
  action.msgType = msgType;
80✔
4056
  action.acceptableCode = TSDB_CODE_TDB_TABLE_NOT_EXIST;
80✔
4057
  return mndTransAppendRedoAction(pTrans, &action);
80✔
4058
}
4059

4060
static int32_t mndBuildDropTbRedoActions(SMnode *pMnode, STrans *pTrans, SHashObj *pVgMap, tmsg_t msgType) {
20✔
4061
  int32_t code = 0;
20✔
4062
  void   *pIter = taosHashIterate(pVgMap, NULL);
20✔
4063
  while (pIter) {
40✔
4064
    const SVDropTbVgReqs *pVgReqs = pIter;
20✔
4065
    int32_t               len = 0;
20✔
4066
    for (int32_t i = 0; i < taosArrayGetSize(pVgReqs->pBatchReqs) && code == TSDB_CODE_SUCCESS; ++i) {
100!
4067
      SVDropTbBatchReq *pBatchReq = taosArrayGet(pVgReqs->pBatchReqs, i);
80✔
4068
      void             *p = mndBuildVDropTbsReq(pMnode, &pVgReqs->info, pBatchReq, &len);
80✔
4069
      if (!p) {
80!
4070
        code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
4071
        if (terrno != 0) code = terrno;
×
4072
        break;
×
4073
      }
4074
      if ((code = mndSetDropTbsRedoActions(pMnode, pTrans, pVgReqs, p, len, msgType)) != 0) {
80!
4075
        break;
×
4076
      }
4077
    }
4078
    if (TSDB_CODE_SUCCESS != code) {
20!
4079
      taosHashCancelIterate(pVgMap, pIter);
×
4080
      break;
×
4081
    }
4082
    pIter = taosHashIterate(pVgMap, pIter);
20✔
4083
  }
4084
  return code;
20✔
4085
}
4086

4087
static int32_t mndCreateDropTbsTxnPrepare(SRpcMsg *pRsp, SMndDropTbsWithTsmaCtx *pCtx) {
30✔
4088
  int32_t code = 0;
30✔
4089
  SMnode *pMnode = pRsp->info.node;
30✔
4090
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, pRsp, "drop-tbs");
30✔
4091
  mndTransSetChangeless(pTrans);
30✔
4092
  mndTransSetSerial(pTrans);
30✔
4093
  if (pTrans == NULL) {
30!
4094
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
4095
    if (terrno != 0) code = terrno;
×
4096
    goto _OVER;
×
4097
  }
4098

4099
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
30✔
4100

4101
  if ((code = mndBuildDropTbRedoActions(pMnode, pTrans, pCtx->pVgMap, TDMT_VND_DROP_TABLE)) != 0) goto _OVER;
20!
4102
  if ((code = mndTransPrepare(pMnode, pTrans)) != 0) goto _OVER;
20!
4103

4104
_OVER:
20✔
4105
  mndTransDrop(pTrans);
30✔
4106
  TAOS_RETURN(code);
30✔
4107
}
4108

4109
static int32_t mndProcessDropTbWithTsma(SRpcMsg *pReq) {
×
4110
  int32_t      code = -1;
×
4111
  SMnode      *pMnode = pReq->info.node;
×
4112
  SDbObj      *pDb = NULL;
×
4113
  SStbObj     *pStb = NULL;
×
4114
  SMDropTbsReq dropReq = {0};
×
4115
  bool         locked = false;
×
4116
  if (tDeserializeSMDropTbsReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
×
4117
    code = TSDB_CODE_INVALID_MSG;
×
4118
    goto _OVER;
×
4119
  }
4120

4121
  SMndDropTbsWithTsmaCtx *pCtx = NULL;
×
4122
  code = mndInitDropTbsWithTsmaCtx(&pCtx);
×
4123
  if (code) goto _OVER;
×
4124
  for (int32_t i = 0; i < dropReq.pVgReqs->size; ++i) {
×
4125
    SMDropTbReqsOnSingleVg *pReq = taosArrayGet(dropReq.pVgReqs, i);
×
4126
    code = mndDropTbForSingleVg(pMnode, pCtx, pReq->pTbs, pReq->vgInfo.vgId);
×
4127
    if (code) goto _OVER;
×
4128
  }
4129
  code = mndCreateDropTbsTxnPrepare(pReq, pCtx);
×
4130
  if (code == 0) {
×
4131
    code = TSDB_CODE_ACTION_IN_PROGRESS;
×
4132
  }
4133
_OVER:
×
4134
  tFreeSMDropTbsReq(&dropReq);
×
4135
  if (pCtx) mndDestroyDropTbsWithTsmaCtx(pCtx);
×
4136
  TAOS_RETURN(code);
×
4137
}
4138

4139
static int32_t createDropTbBatchReq(const SVDropTbReq *pReq, SVDropTbBatchReq *pBatchReq) {
123✔
4140
  pBatchReq->nReqs = 1;
123✔
4141
  pBatchReq->pArray = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SVDropTbReq));
123✔
4142
  if (!pBatchReq->pArray) return terrno;
123!
4143
  if (taosArrayPush(pBatchReq->pArray, pReq) == NULL) {
246!
4144
    taosArrayDestroy(pBatchReq->pArray);
×
4145
    pBatchReq->pArray = NULL;
×
4146
    return terrno;
×
4147
  }
4148
  return TSDB_CODE_SUCCESS;
123✔
4149
}
4150

4151
static void destroySVDropTbBatchReqs(void *p) {
123✔
4152
  SVDropTbBatchReq *pReq = p;
123✔
4153
  taosArrayDestroy(pReq->pArray);
123✔
4154
  pReq->pArray = NULL;
123✔
4155
}
123✔
4156

4157
static int32_t mndDropTbAdd(SMnode *pMnode, SHashObj *pVgHashMap, const SVgroupInfo *pVgInfo, char *name, tb_uid_t suid,
123✔
4158
                            bool ignoreNotExists) {
4159
  SVDropTbReq req = {.name = name, .suid = suid, .igNotExists = ignoreNotExists, .uid = 0};
123✔
4160

4161
  SVDropTbVgReqs *pVgReqs = taosHashGet(pVgHashMap, &pVgInfo->vgId, sizeof(pVgInfo->vgId));
123✔
4162
  SVDropTbVgReqs  vgReqs = {0};
123✔
4163
  if (pVgReqs == NULL) {
123✔
4164
    vgReqs.info = *pVgInfo;
30✔
4165
    vgReqs.pBatchReqs = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SVDropTbBatchReq));
30✔
4166
    if (!vgReqs.pBatchReqs) return terrno;
30!
4167
    SVDropTbBatchReq batchReq = {0};
30✔
4168
    int32_t          code = createDropTbBatchReq(&req, &batchReq);
30✔
4169
    if (TSDB_CODE_SUCCESS != code) return code;
30!
4170
    if (taosArrayPush(vgReqs.pBatchReqs, &batchReq) == NULL) {
60!
4171
      taosArrayDestroy(batchReq.pArray);
×
4172
      return terrno;
×
4173
    }
4174
    if (taosHashPut(pVgHashMap, &pVgInfo->vgId, sizeof(pVgInfo->vgId), &vgReqs, sizeof(vgReqs)) != 0) {
30!
4175
      taosArrayDestroyEx(vgReqs.pBatchReqs, destroySVDropTbBatchReqs);
×
4176
      return terrno;
×
4177
    }
4178
  } else {
4179
    SVDropTbBatchReq batchReq = {0};
93✔
4180
    int32_t          code = createDropTbBatchReq(&req, &batchReq);
93✔
4181
    if (TSDB_CODE_SUCCESS != code) return code;
93!
4182
    if (taosArrayPush(pVgReqs->pBatchReqs, &batchReq) == NULL) {
186!
4183
      taosArrayDestroy(batchReq.pArray);
×
4184
      return terrno;
×
4185
    }
4186
  }
4187
  return 0;
123✔
4188
}
4189

4190
static int32_t mndDropTbForSingleVg(SMnode *pMnode, SMndDropTbsWithTsmaCtx *pCtx, SArray *pTbs, int32_t vgId) {
30✔
4191
  int32_t code = 0;
30✔
4192

4193
  SVgObj *pVgObj = mndAcquireVgroup(pMnode, vgId);
30✔
4194
  if (!pVgObj) {
30!
4195
    code = 0;
×
4196
    goto _end;
×
4197
  }
4198
  SVgroupInfo vgInfo = {.hashBegin = pVgObj->hashBegin,
30✔
4199
                        .hashEnd = pVgObj->hashEnd,
30✔
4200
                        .numOfTable = pVgObj->numOfTables,
30✔
4201
                        .vgId = pVgObj->vgId};
30✔
4202
  vgInfo.epSet = mndGetVgroupEpset(pMnode, pVgObj);
30✔
4203
  mndReleaseVgroup(pMnode, pVgObj);
30✔
4204

4205
  for (int32_t i = 0; i < pTbs->size; ++i) {
153✔
4206
    SVDropTbReq *pTb = taosArrayGet(pTbs, i);
123✔
4207
    TAOS_CHECK_GOTO(mndDropTbAdd(pMnode, pCtx->pVgMap, &vgInfo, pTb->name, pTb->suid, pTb->igNotExists), NULL, _end);
123!
4208
  }
4209
_end:
30✔
4210
  return code;
30✔
4211
}
4212

4213
static int32_t mndProcessFetchTtlExpiredTbs(SRpcMsg *pRsp) {
68,191✔
4214
  int32_t                 code = -1;
68,191✔
4215
  SDecoder                decoder = {0};
68,191✔
4216
  SMnode                 *pMnode = pRsp->info.node;
68,191✔
4217
  SVFetchTtlExpiredTbsRsp rsp = {0};
68,191✔
4218
  SMndDropTbsWithTsmaCtx *pCtx = NULL;
68,191✔
4219
  if (pRsp->code != TSDB_CODE_SUCCESS) {
68,191✔
4220
    code = pRsp->code;
608✔
4221
    goto _end;
608✔
4222
  }
4223
  if (pRsp->contLen == 0) {
67,583✔
4224
    code = 0;
67,553✔
4225
    goto _end;
67,553✔
4226
  }
4227

4228
  tDecoderInit(&decoder, pRsp->pCont, pRsp->contLen);
30✔
4229
  code = tDecodeVFetchTtlExpiredTbsRsp(&decoder, &rsp);
30✔
4230
  if (code) goto _end;
30!
4231

4232
  code = mndInitDropTbsWithTsmaCtx(&pCtx);
30✔
4233
  if (code) goto _end;
30!
4234

4235
  code = mndDropTbForSingleVg(pMnode, pCtx, rsp.pExpiredTbs, rsp.vgId);
30✔
4236
  if (code) goto _end;
30!
4237
  code = mndCreateDropTbsTxnPrepare(pRsp, pCtx);
30✔
4238
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
30✔
4239
_end:
10✔
4240
  if (pCtx) mndDestroyDropTbsWithTsmaCtx(pCtx);
68,191✔
4241
  tDecoderClear(&decoder);
68,191✔
4242
  tFreeFetchTtlExpiredTbsRsp(&rsp);
68,191✔
4243
  TAOS_RETURN(code);
68,191✔
4244
}
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

© 2025 Coveralls, Inc