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

taosdata / TDengine / #4456

05 Jul 2025 10:40AM UTC coverage: 63.212% (+2.5%) from 60.734%
#4456

push

travis-ci

web-flow
Merge pull request #31673 from taosdata/fix/huoh/taos_log

test: fix mnode create failure

159366 of 321690 branches covered (49.54%)

Branch coverage included in aggregate %.

246655 of 320626 relevant lines covered (76.93%)

14815045.54 hits per line

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

66.59
/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,588✔
70
  SSdbTable table = {
2,588✔
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,588✔
81
  mndSetMsgHandle(pMnode, TDMT_MND_ALTER_STB, mndProcessAlterStbReq);
2,588✔
82
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_STB, mndProcessDropStbReq);
2,588✔
83
  mndSetMsgHandle(pMnode, TDMT_VND_CREATE_STB_RSP, mndTransProcessRsp);
2,588✔
84
  mndSetMsgHandle(pMnode, TDMT_VND_DROP_TTL_TABLE_RSP, mndProcessDropTtltbRsp);
2,588✔
85
  mndSetMsgHandle(pMnode, TDMT_VND_TRIM_RSP, mndProcessTrimDbRsp);
2,588✔
86
  mndSetMsgHandle(pMnode, TDMT_VND_ALTER_STB_RSP, mndTransProcessRsp);
2,588✔
87
  mndSetMsgHandle(pMnode, TDMT_VND_DROP_STB_RSP, mndTransProcessRsp);
2,588✔
88
  mndSetMsgHandle(pMnode, TDMT_MND_TABLE_META, mndProcessTableMetaReq);
2,588✔
89
  mndSetMsgHandle(pMnode, TDMT_MND_TTL_TIMER, mndProcessTtlTimer);
2,588✔
90
  mndSetMsgHandle(pMnode, TDMT_MND_TRIM_DB_TIMER, mndProcessTrimDbTimer);
2,588✔
91
  mndSetMsgHandle(pMnode, TDMT_VND_S3MIGRATE_RSP, mndProcessS3MigrateDbRsp);
2,588✔
92
  mndSetMsgHandle(pMnode, TDMT_MND_S3MIGRATE_DB_TIMER, mndProcessS3MigrateDbTimer);
2,588✔
93
  mndSetMsgHandle(pMnode, TDMT_MND_TABLE_CFG, mndProcessTableCfgReq);
2,588✔
94
  mndSetMsgHandle(pMnode, TDMT_MND_STB_DROP, mndProcessDropStbReqFromMNode);
2,588✔
95
  mndSetMsgHandle(pMnode, TDMT_MND_STB_DROP_RSP, mndTransProcessRsp);
2,588✔
96
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_TB_WITH_TSMA, mndProcessDropTbWithTsma);
2,588✔
97
  mndSetMsgHandle(pMnode, TDMT_VND_FETCH_TTL_EXPIRED_TBS_RSP, mndProcessFetchTtlExpiredTbs);
2,588✔
98
  mndSetMsgHandle(pMnode, TDMT_VND_DROP_TABLE_RSP, mndTransProcessRsp);
2,588✔
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,588✔
107
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_STB, mndCancelGetNextStb);
2,588✔
108

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

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

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

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

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

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

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

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

171
  for (int32_t i = 0; i < pStb->numOfFuncs; ++i) {
55,073✔
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) {
55,057✔
177
    SDB_SET_BINARY(pRaw, dataPos, pStb->comment, pStb->commentLen + 1, _OVER)
225!
178
  }
179

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

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

188
  if (pStb->pCmpr != NULL) {
55,057!
189
    for (int i = 0; i < pStb->numOfColumns; i++) {
3,635,966✔
190
      SColCmpr *p = &pStb->pCmpr[i];
3,580,909✔
191
      SDB_SET_INT16(pRaw, dataPos, p->id, _OVER)
3,580,909!
192
      SDB_SET_INT32(pRaw, dataPos, p->alg, _OVER)
3,580,909!
193
    }
194
  }
195
  SDB_SET_INT64(pRaw, dataPos, pStb->keep, _OVER)
55,057!
196

197
  if (hasTypeMod) {
55,057✔
198
    for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
2,526,889✔
199
      SDB_SET_INT32(pRaw, dataPos, pStb->pExtSchemas[i].typeMod, _OVER);
2,520,031!
200
    }
201
  }
202

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

207
  terrno = 0;
55,057✔
208

209
_OVER:
55,057✔
210
  if (terrno != 0) {
55,057!
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);
55,057✔
217
  return pRaw;
55,057✔
218
}
219

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

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

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

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

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

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

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

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

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

291
  for (int32_t i = 0; i < pStb->numOfFuncs; ++i) {
42,459✔
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,447✔
298
    pStb->comment = taosMemoryCalloc(pStb->commentLen + 1, 1);
197!
299
    if (pStb->comment == NULL) goto _OVER;
197!
300
    SDB_GET_BINARY(pRaw, dataPos, pStb->comment, pStb->commentLen + 1, _OVER)
197!
301
  }
302

303
  if (pStb->ast1Len > 0) {
42,447✔
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,447✔
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,447!
316
  if (sver < STB_VER_NUMBER - 1) {
42,447!
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++) {
7,216,824✔
327
      SColCmpr *pCmpr = &pStb->pCmpr[i];
7,174,377✔
328
      SDB_GET_INT16(pRaw, dataPos, &pCmpr->id, _OVER)
7,174,377!
329
      SDB_GET_INT32(pRaw, dataPos, (int32_t *)&pCmpr->alg, _OVER)  // compatiable
7,174,377!
330
    }
331
  }
332
  SDB_GET_INT64(pRaw, dataPos, &pStb->keep, _OVER)
42,447!
333

334
  // type mod
335
  if (hasExtSchemas) {
42,447✔
336
    pStb->pExtSchemas = taosMemoryCalloc(pStb->numOfColumns, sizeof(SExtSchema));
14,605!
337
    if (!pStb->pExtSchemas) goto _OVER;
14,605!
338
    for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
6,514,863✔
339
      SSchema *pSchema = &pStb->pColumns[i];
6,500,258✔
340
      SDB_GET_INT32(pRaw, dataPos, &pStb->pExtSchemas[i].typeMod, _OVER)
6,500,258!
341
    }
342
  }
343

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

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

352
  terrno = 0;
42,447✔
353

354
_OVER:
42,447✔
355
  if (terrno != 0) {
42,447!
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,447✔
369
  return pRow;
42,447✔
370
}
371

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

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

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

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

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

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

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

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

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

494
END:
7,175✔
495
  taosWUnLockLatch(&pOld->lock);
21,667✔
496
  return terrno;
21,667✔
497
}
498

499
SStbObj *mndAcquireStb(SMnode *pMnode, char *stbName) {
1,460,296✔
500
  SSdb    *pSdb = pMnode->pSdb;
1,460,296✔
501
  SStbObj *pStb = sdbAcquire(pSdb, SDB_STB, stbName);
1,460,296✔
502
  if (pStb == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
1,460,305!
503
    terrno = TSDB_CODE_MND_STB_NOT_EXIST;
15,994✔
504
  }
505
  return pStb;
1,460,300✔
506
}
507

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

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

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

520
  return mndAcquireDb(pMnode, db);
21,872✔
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,
39,201✔
533
                            int32_t alterOriDataLen) {
534
  SEncoder       encoder = {0};
39,201✔
535
  int32_t        contLen;
536
  SName          name = {0};
39,201✔
537
  SVCreateStbReq req = {0};
39,201✔
538

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

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

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

568
  req.colCmpr.pColCmpr = taosMemoryCalloc(pCmpr->nCols, sizeof(SColCmpr));
39,201!
569
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
3,298,698✔
570
    SColCmpr *p = &pCmpr->pColCmpr[i];
3,259,497✔
571
    p->alg = pStb->pCmpr[i].alg;
3,259,497✔
572
    p->id = pStb->pCmpr[i].id;
3,259,497✔
573
  }
574

575
  if (req.rollup) {
39,201✔
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.
39,201✔
596
  // get length
597
  int32_t ret = 0;
39,201✔
598
  tEncodeSize(tEncodeSVCreateStbReq, &req, contLen, ret);
39,201!
599
  if (ret < 0) {
39,201!
600
    goto _err;
×
601
  }
602

603
  contLen += sizeof(SMsgHead);
39,201✔
604

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

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

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

623
  *pContLen = contLen;
39,201✔
624
  taosMemoryFreeClear(req.rsmaParam.qmsg[0]);
39,201!
625
  taosMemoryFreeClear(req.rsmaParam.qmsg[1]);
39,201!
626
  taosMemoryFreeClear(req.colCmpr.pColCmpr);
39,201!
627
  return pHead;
39,201✔
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) {
31,223✔
636
  SName        name = {0};
31,223✔
637
  SVDropStbReq req = {0};
31,223✔
638
  int32_t      contLen = 0;
31,223✔
639
  int32_t      ret = 0;
31,223✔
640
  SMsgHead    *pHead = NULL;
31,223✔
641
  SEncoder     encoder = {0};
31,223✔
642

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

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

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

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

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

663
  void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
31,223✔
664

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

673
  *pContLen = contLen;
31,223✔
674
  return pHead;
31,223✔
675
}
676

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

684
  if (pCreate->virtualStb != 0 && pCreate->virtualStb != 1) {
11,778!
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) {
11,778!
690
    code = TSDB_CODE_PAR_INVALID_COLUMNS_NUM;
×
691
    TAOS_RETURN(code);
×
692
  }
693

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

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

705
  for (int32_t i = 0; i < pCreate->numOfColumns; ++i) {
319,392✔
706
    SFieldWithOptions *pField1 = taosArrayGet(pCreate->pColumns, i);
307,614✔
707
    if (pField1->type >= TSDB_DATA_TYPE_MAX) {
307,614!
708
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
709
      TAOS_RETURN(code);
×
710
    }
711
    if (pField1->bytes <= 0) {
307,614!
712
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
713
      TAOS_RETURN(code);
×
714
    }
715
    if (pField1->name[0] == 0) {
307,614!
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) {
83,236✔
722
    SField *pField1 = taosArrayGet(pCreate->pTags, i);
71,458✔
723
    if (pField1->type >= TSDB_DATA_TYPE_MAX) {
71,458!
724
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
725
      TAOS_RETURN(code);
×
726
    }
727
    if (pField1->bytes <= 0) {
71,458!
728
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
729
      TAOS_RETURN(code);
×
730
    }
731
    if (pField1->name[0] == 0) {
71,458!
732
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
733
      TAOS_RETURN(code);
×
734
    }
735
  }
736

737
  TAOS_RETURN(code);
11,778✔
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) {
11,534✔
758
  int32_t  code = 0;
11,534✔
759
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
11,534✔
760
  if (pCommitRaw == NULL) {
11,534!
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) {
11,534!
766
    sdbFreeRaw(pCommitRaw);
×
767
    TAOS_RETURN(code);
×
768
  }
769
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
11,534!
770

771
  TAOS_RETURN(code);
11,534✔
772
}
773

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

781
  while (1) {
103,047✔
782
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
114,581✔
783
    if (pIter == NULL) break;
114,581✔
784
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
103,047✔
785
      sdbRelease(pSdb, pVgroup);
75,224✔
786
      continue;
75,224✔
787
    }
788

789
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, NULL, 0);
27,823✔
790
    if (pReq == NULL) {
27,823!
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};
27,823✔
799
    action.mTraceId = pTrans->mTraceId;
27,823✔
800
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
27,823✔
801
    action.pCont = pReq;
27,823✔
802
    action.contLen = contLen;
27,823✔
803
    action.msgType = TDMT_VND_CREATE_STB;
27,823✔
804
    action.acceptableCode = TSDB_CODE_TDB_STB_ALREADY_EXIST;
27,823✔
805
    action.retryCode = TSDB_CODE_TDB_STB_NOT_EXIST;
27,823✔
806
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
27,823!
807
      taosMemoryFree(pReq);
×
808
      sdbCancelFetch(pSdb, pIter);
×
809
      sdbRelease(pSdb, pVgroup);
×
810
      TAOS_RETURN(code);
×
811
    }
812
    sdbRelease(pSdb, pVgroup);
27,823✔
813
  }
814

815
  TAOS_RETURN(code);
11,534✔
816
}
817

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

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

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

844
  TAOS_RETURN(code);
4✔
845
}
846

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

853
  while (1) {
103,047✔
854
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
114,581✔
855
    if (pIter == NULL) break;
114,581✔
856
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
103,047✔
857
      sdbRelease(pSdb, pVgroup);
75,224✔
858
      continue;
75,224✔
859
    }
860

861
    int32_t contLen = 0;
27,823✔
862
    void   *pReq = mndBuildVDropStbReq(pMnode, pVgroup, pStb, &contLen);
27,823✔
863
    if (pReq == NULL) {
27,823!
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};
27,823✔
871
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
27,823✔
872
    action.pCont = pReq;
27,823✔
873
    action.contLen = contLen;
27,823✔
874
    action.msgType = TDMT_VND_DROP_STB;
27,823✔
875
    action.acceptableCode = TSDB_CODE_TDB_STB_NOT_EXIST;
27,823✔
876
    if ((code = mndTransAppendUndoAction(pTrans, &action)) != 0) {
27,823!
877
      taosMemoryFree(pReq);
×
878
      sdbCancelFetch(pSdb, pIter);
×
879
      sdbRelease(pSdb, pVgroup);
×
880
      TAOS_RETURN(code);
×
881
    }
882
    sdbRelease(pSdb, pVgroup);
27,823✔
883
  }
884

885
  TAOS_RETURN(code);
11,534✔
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) {
11,563✔
899
  int32_t code = 0;
11,563✔
900
  bool    hasTypeMods = false;
11,563✔
901
  memcpy(pDst->name, pCreate->name, TSDB_TABLE_FNAME_LEN);
11,563✔
902
  memcpy(pDst->db, pDb->name, TSDB_DB_FNAME_LEN);
11,563✔
903
  pDst->createdTime = taosGetTimestampMs();
11,563✔
904
  pDst->updateTime = pDst->createdTime;
11,563✔
905
  pDst->uid = (pCreate->source == TD_REQ_FROM_TAOX_OLD || pCreate->source == TD_REQ_FROM_TAOX || pCreate->source == TD_REQ_FROM_SML)
11,563!
906
                  ? pCreate->suid
907
                  : mndGenerateUid(pCreate->name, TSDB_TABLE_FNAME_LEN);
23,126!
908
  pDst->dbUid = pDb->uid;
11,563✔
909
  pDst->tagVer = 1;
11,563✔
910
  pDst->colVer = 1;
11,563✔
911
  pDst->smaVer = 1;
11,563✔
912
  pDst->nextColId = 1;
11,563✔
913
  pDst->maxdelay[0] = pCreate->delay1;
11,563✔
914
  pDst->maxdelay[1] = pCreate->delay2;
11,563✔
915
  pDst->watermark[0] = pCreate->watermark1;
11,563✔
916
  pDst->watermark[1] = pCreate->watermark2;
11,563✔
917
  pDst->ttl = pCreate->ttl;
11,563✔
918
  pDst->numOfColumns = pCreate->numOfColumns;
11,563✔
919
  pDst->numOfTags = pCreate->numOfTags;
11,563✔
920
  pDst->numOfFuncs = pCreate->numOfFuncs;
11,563✔
921
  pDst->commentLen = pCreate->commentLen;
11,563✔
922
  pDst->pFuncs = pCreate->pFuncs;
11,563✔
923
  pDst->source = pCreate->source;
11,563✔
924
  pDst->keep = pCreate->keep;
11,563✔
925
  pDst->virtualStb = pCreate->virtualStb;
11,563✔
926
  pCreate->pFuncs = NULL;
11,563✔
927

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

937
  pDst->ast1Len = pCreate->ast1Len;
11,563✔
938
  if (pDst->ast1Len > 0) {
11,563✔
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;
11,563✔
948
  if (pDst->ast2Len > 0) {
11,563✔
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));
11,563!
958
  pDst->pTags = taosMemoryCalloc(1, pDst->numOfTags * sizeof(SSchema));
11,563!
959
  if (pDst->pColumns == NULL || pDst->pTags == NULL) {
11,563!
960
    code = terrno;
×
961
    TAOS_RETURN(code);
×
962
  }
963

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

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

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

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

1004
  if (hasTypeMods) {
11,563✔
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);
11,563✔
1016
}
1017
static int32_t mndGenIdxNameForFirstTag(char *fullname, char *dbname, char *stbname, char *tagname) {
10,127✔
1018
  SName name = {0};
10,127✔
1019
  if ((terrno = tNameFromString(&name, stbname, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0) {
10,127!
1020
    return -1;
×
1021
  }
1022
  return snprintf(fullname, TSDB_INDEX_FNAME_LEN, "%s.%s_%s", dbname, tagname, tNameGetTableName(&name));
10,127✔
1023
}
1024

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

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

1031
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_DB_INSIDE, pReq, "create-stb");
10,127✔
1032
  if (pTrans == NULL) {
10,127!
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);
10,127!
1039
  TAOS_CHECK_GOTO(mndBuildStbFromReq(pMnode, &stbObj, pCreate, pDb), NULL, _OVER);
10,127!
1040

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

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

1062
  TAOS_CHECK_GOTO(mndSetCreateIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
10,127!
1063

1064
  TAOS_CHECK_GOTO(mndAddStbToTrans(pMnode, pTrans, pDb, &stbObj), NULL, _OVER);
10,127✔
1065
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
10,098✔
1066
  code = 0;
10,095✔
1067

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

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

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

1093
  mDebug("start to process ttl timer");
6,796✔
1094

1095
  while (1) {
56,166✔
1096
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
62,962✔
1097
    if (pIter == NULL) break;
62,962✔
1098

1099
    int32_t   code = 0;
56,166✔
1100
    SMsgHead *pHead = rpcMallocCont(contLen);
56,166✔
1101
    if (pHead == NULL) {
56,166!
1102
      sdbRelease(pSdb, pVgroup);
×
1103
      continue;
×
1104
    }
1105
    pHead->contLen = htonl(contLen);
56,166✔
1106
    pHead->vgId = htonl(pVgroup->vgId);
56,166✔
1107
    if ((code = tSerializeSVDropTtlTableReq((char *)pHead + sizeof(SMsgHead), reqLen, &ttlReq)) < 0) {
56,166!
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 = {
56,166✔
1114
        .msgType = TDMT_VND_FETCH_TTL_EXPIRED_TBS, .pCont = pHead, .contLen = contLen, .info = pReq->info};
1115
    SEpSet epSet = mndGetVgroupEpset(pMnode, pVgroup);
56,166✔
1116
    code = tmsgSendReq(&epSet, &rpcMsg);
56,166✔
1117
    if (code != 0) {
56,166✔
1118
      mError("vgId:%d, failed to send drop ttl table request to vnode since 0x%x", pVgroup->vgId, code);
131!
1119
    } else {
1120
      mDebug("vgId:%d, send drop ttl table request to vnode, time:%" PRId32, pVgroup->vgId, ttlReq.timestampSec);
56,035✔
1121
    }
1122
    sdbRelease(pSdb, pVgroup);
56,166✔
1123
  }
1124

1125
  return 0;
6,796✔
1126
}
1127

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

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

1141
    int32_t code = 0;
53✔
1142

1143
    SMsgHead *pHead = rpcMallocCont(contLen);
53✔
1144
    if (pHead == NULL) {
53!
1145
      sdbCancelFetch(pSdb, pVgroup);
×
1146
      sdbRelease(pSdb, pVgroup);
×
1147
      continue;
×
1148
    }
1149
    pHead->contLen = htonl(contLen);
53✔
1150
    pHead->vgId = htonl(pVgroup->vgId);
53✔
1151
    if ((code = tSerializeSVTrimDbReq((char *)pHead + sizeof(SMsgHead), reqLen, &trimReq)) < 0) {
53!
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};
53✔
1156
    SEpSet  epSet = mndGetVgroupEpset(pMnode, pVgroup);
53✔
1157
    code = tmsgSendReq(&epSet, &rpcMsg);
53✔
1158
    if (code != 0) {
53!
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);
53!
1162
    }
1163
    sdbRelease(pSdb, pVgroup);
53✔
1164
  }
1165

1166
  return 0;
1✔
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,674✔
1212
  for (int32_t tag = 0; tag < pStb->numOfTags; tag++) {
107,454✔
1213
    if (strcmp(pStb->pTags[tag].name, tagName) == 0) {
104,059✔
1214
      return tag;
2,279✔
1215
    }
1216
  }
1217

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

1221
static int32_t mndFindSuperTableColumnIndex(const SStbObj *pStb, const char *colName) {
5,796✔
1222
  for (int32_t col = 0; col < pStb->numOfColumns; col++) {
1,134,812✔
1223
    if (strcmp(pStb->pColumns[col].name, colName) == 0) {
1,131,297✔
1224
      return col;
2,281✔
1225
    }
1226
  }
1227

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

1231
static bool mndValidateSchema(SSchema *pSchemas, int32_t nSchema, SArray *pFields, int32_t maxLen) {
3,363✔
1232
  int32_t rowLen = 0;
3,363✔
1233
  for (int32_t i = 0; i < nSchema; ++i) {
627,203✔
1234
    rowLen += (pSchemas + i)->bytes;
623,840✔
1235
  }
1236

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

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

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

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

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

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

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

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

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

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

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

1337
  pStb = mndAcquireStb(pMnode, createReq.name);
10,342✔
1338
  if (pStb != NULL) {
10,342✔
1339
    if (createReq.igExists) {
211✔
1340
      if (createReq.source == TD_REQ_FROM_APP) {
206✔
1341
        mInfo("stb:%s, already exist, ignore exist is set", createReq.name);
10!
1342
        code = 0;
10✔
1343
        goto _OVER;
10✔
1344
      } else if (pStb->uid != createReq.suid) {
196!
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) {
292!
1349
        int32_t tagDelta = createReq.tagVer - pStb->tagVer;
196✔
1350
        int32_t colDelta = createReq.colVer - pStb->colVer;
196✔
1351
        mInfo("stb:%s, already exist while create, input tagVer:%d colVer:%d, exist tagVer:%d colVer:%d",
196!
1352
              createReq.name, createReq.tagVer, createReq.colVer, pStb->tagVer, pStb->colVer);
1353
        if (tagDelta <= 0 && colDelta <= 0) {
196✔
1354
          mInfo("stb:%s, schema version is not incremented and nothing needs to be done", createReq.name);
100!
1355
          code = 0;
100✔
1356
          goto _OVER;
100✔
1357
        } else if ((tagDelta == 1 && colDelta == 0) || (tagDelta == 0 && colDelta == 1) ||
96!
1358
                   (pStb->colVer == 1 && createReq.colVer > 1) || (pStb->tagVer == 1 && createReq.tagVer > 1)) {
×
1359
          isAlter = true;
96✔
1360
          mInfo("stb:%s, schema version is only increased by 1 number, do alter operation", createReq.name);
96!
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;
5✔
1374
      goto _OVER;
5✔
1375
    }
1376
  } else if (terrno != TSDB_CODE_MND_STB_NOT_EXIST) {
10,131!
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) &&
10,131!
1379
             (createReq.tagVer != 1 || createReq.colVer != 1)) {
49✔
1380
    mInfo("stb:%s, alter table does not need to be done, because table is deleted", createReq.name);
3!
1381
    code = 0;
3✔
1382
    goto _OVER;
3✔
1383
  }
1384

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

1392
  for (int32_t i = 0; i < createReq.numOfColumns; ++i) {
301,001✔
1393
    SFieldWithOptions *pField = taosArrayGet(createReq.pColumns, i);
290,777✔
1394
    if ((code = taosHashPut(pHash, pField->name, strlen(pField->name), NULL, 0)) != 0) {
290,777!
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) {
78,887✔
1403
    SField *pField = taosArrayGet(createReq.pTags, i);
68,664✔
1404
    if ((code = taosHashPut(pHash, pField->name, strlen(pField->name), NULL, 0)) != 0) {
68,664✔
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);
10,223✔
1413
  if (pDb == NULL) {
10,223!
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) {
10,223!
1419
    goto _OVER;
×
1420
  }
1421

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

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

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

1436
  if (isAlter) {
10,223✔
1437
    bool    needRsp = false;
96✔
1438
    SStbObj pDst = {0};
96✔
1439
    if ((code = mndBuildStbFromAlter(pStb, &pDst, &createReq)) != 0) {
96!
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);
96✔
1448
    taosMemoryFreeClear(pDst.pTags);
96!
1449
    taosMemoryFreeClear(pDst.pColumns);
96!
1450
    taosMemoryFreeClear(pDst.pCmpr);
96!
1451
    taosMemoryFreeClear(pDst.pExtSchemas);
96!
1452
  } else {
1453
    code = mndCreateStb(pMnode, pReq, &createReq, pDb);
10,127✔
1454
  }
1455
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
10,223✔
1456

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

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

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

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

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

1478
  if (pHash != NULL) {
10,342✔
1479
    taosHashCleanup(pHash);
10,224✔
1480
  }
1481

1482
  TAOS_RETURN(code);
10,342✔
1483
}
1484

1485
static int32_t mndCheckAlterStbReq(SMAlterStbReq *pAlter) {
6,321✔
1486
  int32_t code = 0;
6,321✔
1487
  if (pAlter->commentLen >= 0) return 0;
6,321!
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) {
8,272✔
1508
  pNew->pTags = taosMemoryCalloc(pNew->numOfTags, sizeof(SSchema));
8,272!
1509
  pNew->pColumns = taosMemoryCalloc(pNew->numOfColumns, sizeof(SSchema));
8,272!
1510
  pNew->pCmpr = taosMemoryCalloc(pNew->numOfColumns, sizeof(SColCmpr));
8,272!
1511
  if (pNew->pTags == NULL || pNew->pColumns == NULL || pNew->pCmpr == NULL) {
8,272!
1512
    TAOS_RETURN(terrno);
×
1513
  }
1514

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

1526
  TAOS_RETURN(0);
8,272✔
1527
}
1528

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

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

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

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

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

1566
  if (pOld->numOfColumns + ntags + pOld->numOfTags > TSDB_MAX_COLUMNS) {
825!
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)) {
825✔
1572
    code = TSDB_CODE_PAR_INVALID_TAGS_LENGTH;
40✔
1573
    TAOS_RETURN(code);
40✔
1574
  }
1575

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

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

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

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

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

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

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

1612
static int32_t mndCheckAlterColForTopic(SMnode *pMnode, const char *stbFullName, int64_t suid, col_id_t colId) {
2,729✔
1613
  int32_t code = 0;
2,729✔
1614
  SSdb   *pSdb = pMnode->pSdb;
2,729✔
1615
  void   *pIter = NULL;
2,729✔
1616
  while (1) {
1,053✔
1617
    SMqTopicObj *pTopic = NULL;
3,782✔
1618
    pIter = sdbFetch(pSdb, SDB_TOPIC, pIter, (void **)&pTopic);
3,782✔
1619
    if (pIter == NULL) break;
3,782✔
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,651✔
1672
}
1673

1674
static int32_t mndCheckAlterColForStream(SMnode *pMnode, const char *stbFullName, int64_t suid, col_id_t colId) {
2,651✔
1675
  int32_t code = 0;
2,651✔
1676
  SSdb   *pSdb = pMnode->pSdb;
2,651✔
1677
  void   *pIter = NULL;
2,651✔
1678
  while (1) {
12✔
1679
    SStreamObj *pStream = NULL;
2,663✔
1680
    pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
2,663✔
1681
    if (pIter == NULL) break;
2,663✔
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,651✔
1726
}
1727

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

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

1791
static int32_t mndDropSuperTableTag(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const char *tagName) {
457✔
1792
  int32_t code = 0;
457✔
1793
  int32_t tag = mndFindSuperTableTagIndex(pOld, tagName);
457✔
1794
  if (tag < 0) {
457✔
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;
453✔
1800
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId));
453✔
1801

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

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

1807
  pNew->tagVer++;
435✔
1808

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

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

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

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

1829
  int32_t tag = mndFindSuperTableTagIndex(pOld, oldTagName);
684✔
1830
  if (tag < 0) {
684✔
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;
670✔
1836
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId));
670✔
1837

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

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

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

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

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

1858
static int32_t mndAlterStbTagBytes(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const SField *pField) {
504✔
1859
  int32_t code = 0;
504✔
1860
  int32_t tag = mndFindSuperTableTagIndex(pOld, pField->name);
504✔
1861
  if (tag < 0) {
504✔
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;
503✔
1867
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId));
503✔
1868

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

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

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

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

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

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

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

1897
  mInfo("stb:%s, start to modify tag len %s to %d", pNew->name, pField->name, pField->bytes);
148!
1898
  TAOS_RETURN(code);
148✔
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;
17✔
1961
    TAOS_RETURN(code);
17✔
1962
  }
1963

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

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

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

1973
  for (int32_t i = 0; i < ncols; i++) {
4,535✔
1974
    if (withCompress) {
2,521✔
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,279✔
1999
      if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
2,279✔
2000
        code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
500✔
2001
        TAOS_RETURN(code);
500✔
2002
      }
2003

2004
      if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
1,779✔
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,772✔
2010
      pSchema->bytes = pField->bytes;
1,772✔
2011
      pSchema->type = pField->type;
1,772✔
2012
      memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
1,772✔
2013
      pSchema->colId = pNew->nextColId;
1,772✔
2014
      pNew->nextColId++;
1,772✔
2015

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

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

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

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

2059
  if (pOld->numOfColumns == 2) {
329✔
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;
328✔
2065
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId));
328✔
2066

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

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

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

2082
static int32_t mndAlterStbColumnBytes(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const SField *pField) {
824✔
2083
  int32_t code = 0;
824✔
2084
  int32_t col = mndFindSuperTableColumnIndex(pOld, pField->name);
824✔
2085
  if (col < 0) {
824✔
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;
821✔
2091

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

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

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

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

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

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

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

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

2125
static int32_t mndSetAlterStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
4,794✔
2126
  int32_t  code = 0;
4,794✔
2127
  SSdbRaw *pRedoRaw = mndStbActionEncode(pStb);
4,794✔
2128
  if (pRedoRaw == NULL) {
4,794!
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) {
4,794!
2134
    sdbFreeRaw(pRedoRaw);
×
2135
    TAOS_RETURN(code);
×
2136
  }
2137
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY));
4,794!
2138

2139
  TAOS_RETURN(code);
4,794✔
2140
}
2141

2142
static int32_t mndSetAlterStbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
4,794✔
2143
  int32_t  code = 0;
4,794✔
2144
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
4,794✔
2145
  if (pCommitRaw == NULL) {
4,794!
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) {
4,794!
2151
    sdbFreeRaw(pCommitRaw);
×
2152
    TAOS_RETURN(code);
×
2153
  }
2154
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
4,794!
2155

2156
  TAOS_RETURN(code);
4,794✔
2157
}
2158

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

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

2175
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, alterOriData, alterOriDataLen);
9,882✔
2176
    if (pReq == NULL) {
9,882!
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};
9,882✔
2184
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
9,882✔
2185
    action.pCont = pReq;
9,882✔
2186
    action.contLen = contLen;
9,882✔
2187
    action.msgType = TDMT_VND_ALTER_STB;
9,882✔
2188
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
9,882!
2189
      taosMemoryFree(pReq);
×
2190
      sdbCancelFetch(pSdb, pIter);
×
2191
      sdbRelease(pSdb, pVgroup);
×
2192
      TAOS_RETURN(code);
×
2193
    }
2194
    sdbRelease(pSdb, pVgroup);
9,882✔
2195
  }
2196

2197
  TAOS_RETURN(code);
4,794✔
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,402,346✔
2242
  int32_t code = 0;
1,402,346✔
2243
  taosRLockLatch(&pStb->lock);
1,402,346✔
2244

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

2274
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
37,975,730✔
2275
    SSchema *pSchema = &pRsp->pSchemas[i];
36,573,415✔
2276
    SSchema *pSrcSchema = &pStb->pColumns[i];
36,573,415✔
2277
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
36,573,415✔
2278
    pSchema->type = pSrcSchema->type;
36,573,415✔
2279
    pSchema->flags = pSrcSchema->flags;
36,573,415✔
2280
    pSchema->colId = pSrcSchema->colId;
36,573,415✔
2281
    pSchema->bytes = pSrcSchema->bytes;
36,573,415✔
2282
  }
2283

2284
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
22,207,140✔
2285
    SSchema *pSchema = &pRsp->pSchemas[i + pStb->numOfColumns];
20,804,825✔
2286
    SSchema *pSrcSchema = &pStb->pTags[i];
20,804,825✔
2287
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
20,804,825✔
2288
    pSchema->type = pSrcSchema->type;
20,804,825✔
2289
    pSchema->flags = pSrcSchema->flags;
20,804,825✔
2290
    pSchema->colId = pSrcSchema->colId;
20,804,825✔
2291
    pSchema->bytes = pSrcSchema->bytes;
20,804,825✔
2292
  }
2293
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
37,977,924✔
2294
    SColCmpr   *pCmpr = &pStb->pCmpr[i];
36,575,609✔
2295
    SSchemaExt *pSchEx = &pRsp->pSchemaExt[i];
36,575,609✔
2296
    pSchEx->colId = pCmpr->id;
36,575,609✔
2297
    pSchEx->compress = pCmpr->alg;
36,575,609✔
2298
    if (pStb->pExtSchemas) {
36,575,609✔
2299
      pSchEx->typeMod = pStb->pExtSchemas[i].typeMod;
1,301,603✔
2300
    }
2301
  }
2302

2303
  taosRUnLockLatch(&pStb->lock);
1,402,315✔
2304
  TAOS_RETURN(code);
1,402,359✔
2305
}
2306

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

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

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

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

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

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

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

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

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

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

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

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

2395
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
33,794✔
2396
  if (pStb == NULL) {
33,794✔
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);
33,713✔
2403

2404
  if (pStbVer->sversion != pStb->colVer || pStbVer->tversion != pStb->tagVer) {
33,713✔
2405
    *schema = true;
646✔
2406
  } else {
2407
    *schema = false;
33,067✔
2408
  }
2409

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

2416
  taosRUnLockLatch(&pStb->lock);
33,713✔
2417

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

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

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

2434
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
1,389,911✔
2435
  if (pStb == NULL) {
1,389,909✔
2436
    mndReleaseDb(pMnode, pDb);
3,154✔
2437
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
3,154✔
2438
    TAOS_RETURN(code);
3,154✔
2439
  }
2440

2441
  code = mndBuildStbSchemaImp(pDb, pStb, tbName, pRsp);
1,386,755✔
2442
  mndReleaseDb(pMnode, pDb);
1,386,759✔
2443
  mndReleaseStb(pMnode, pStb);
1,386,776✔
2444
  TAOS_RETURN(code);
1,386,777✔
2445
}
2446

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

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

2458
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
72✔
2459
  if (pStb == NULL) {
72!
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);
72✔
2466

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

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

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

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

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

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

2508
  tFreeSMAlterStbRsp(&alterRsp);
4,662✔
2509

2510
  if (code < 0) TAOS_RETURN(code);
4,662!
2511

2512
  *pCont = cont;
4,662✔
2513
  *pLen = contLen;
4,662✔
2514

2515
  TAOS_RETURN(code);
4,662✔
2516
}
2517

2518
int32_t mndBuildSMCreateStbRsp(SMnode *pMnode, char *dbFName, char *stbFName, void **pCont, int32_t *pLen) {
10,935✔
2519
  int32_t code = -1;
10,935✔
2520
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
10,935✔
2521
  if (NULL == pDb) {
10,935!
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);
10,935✔
2528
  if (NULL == pObj) {
10,935✔
2529
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
2✔
2530
    if (terrno != 0) code = terrno;
2!
2531
    goto _OVER;
2✔
2532
  }
2533

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

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

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

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

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

2568
  tFreeSMCreateStbRsp(&stbRsp);
10,933✔
2569

2570
  *pCont = cont;
10,933✔
2571
  *pLen = contLen;
10,933✔
2572

2573
  code = 0;
10,933✔
2574

2575
_OVER:
10,935✔
2576
  if (pObj) {
10,935✔
2577
    mndReleaseStb(pMnode, pObj);
10,933✔
2578
  }
2579

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

2584
  TAOS_RETURN(code);
10,935✔
2585
}
2586

2587
static int32_t mndAlterStbImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
3,784✔
2588
                              void *alterOriData, int32_t alterOriDataLen) {
2589
  int32_t code = -1;
3,784✔
2590
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "alter-stb");
3,784✔
2591
  if (pTrans == NULL) {
3,784!
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);
3,784!
2598
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
3,784✔
2599
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
3,784✔
2600

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

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

2613
  code = 0;
3,727✔
2614

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

2620
static int32_t mndAlterStbAndUpdateTagIdxImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
1,067✔
2621
                                             void *alterOriData, int32_t alterOriDataLen, const SMAlterStbReq *pAlter) {
2622
  int32_t code = -1;
1,067✔
2623
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "alter-stb");
1,067✔
2624
  if (pTrans == NULL) {
1,067!
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,067!
2631
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
1,067✔
2632

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

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

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

2652
    if (exist == true) {
435✔
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);
435!
2658
    TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
435!
2659

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

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

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

2675
    if (exist == true) {
632✔
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);
632!
2683
    TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
632!
2684
  }
2685
  code = 0;
1,067✔
2686

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

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

2697
  SStbObj stbObj = {0};
6,295✔
2698
  taosRLockLatch(&pOld->lock);
6,295✔
2699
  memcpy(&stbObj, pOld, sizeof(SStbObj));
6,295✔
2700
  taosRUnLockLatch(&pOld->lock);
6,295✔
2701
  stbObj.pColumns = NULL;
6,295✔
2702
  stbObj.pTags = NULL;
6,295✔
2703
  stbObj.pFuncs = NULL;
6,295✔
2704
  stbObj.pCmpr = NULL;
6,295✔
2705
  stbObj.pExtSchemas = NULL;
6,295✔
2706
  stbObj.updateTime = taosGetTimestampMs();
6,295✔
2707
  stbObj.lock = 0;
6,295✔
2708
  stbObj.virtualStb = pOld->virtualStb;
6,295✔
2709
  bool updateTagIndex = false;
6,295✔
2710
  switch (pAlter->alterType) {
6,295!
2711
    case TSDB_ALTER_TABLE_ADD_TAG:
825✔
2712
      code = mndAddSuperTableTag(pOld, &stbObj, pAlter->pFields, pAlter->numOfFields);
825✔
2713
      break;
825✔
2714
    case TSDB_ALTER_TABLE_DROP_TAG:
457✔
2715
      pField0 = taosArrayGet(pAlter->pFields, 0);
457✔
2716
      code = mndDropSuperTableTag(pMnode, pOld, &stbObj, pField0->name);
457✔
2717
      updateTagIndex = true;
457✔
2718
      break;
457✔
2719
    case TSDB_ALTER_TABLE_UPDATE_TAG_NAME:
684✔
2720
      code = mndAlterStbTagName(pMnode, pOld, &stbObj, pAlter->pFields);
684✔
2721
      updateTagIndex = true;
684✔
2722
      break;
684✔
2723
    case TSDB_ALTER_TABLE_UPDATE_TAG_BYTES:
504✔
2724
      pField0 = taosArrayGet(pAlter->pFields, 0);
504✔
2725
      code = mndAlterStbTagBytes(pMnode, pOld, &stbObj, pField0);
504✔
2726
      break;
504✔
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:
341✔
2731
      pField0 = taosArrayGet(pAlter->pFields, 0);
341✔
2732
      code = mndDropSuperTableColumn(pMnode, pOld, &stbObj, pField0->name);
341✔
2733
      break;
341✔
2734
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES:
824✔
2735
      pField0 = taosArrayGet(pAlter->pFields, 0);
824✔
2736
      code = mndAlterStbColumnBytes(pMnode, pOld, &stbObj, pField0);
824✔
2737
      break;
824✔
2738
    case TSDB_ALTER_TABLE_UPDATE_OPTIONS:
36✔
2739
      needRsp = false;
36✔
2740
      code = mndUpdateTableOptions(pOld, &stbObj, pAlter->comment, pAlter->commentLen, pAlter->ttl, pAlter->keep);
36✔
2741
      break;
36✔
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,295✔
2755
  if (updateTagIndex == false) {
4,755✔
2756
    code = mndAlterStbImp(pMnode, pReq, pDb, &stbObj, needRsp, pReq->pCont, pReq->contLen);
3,688✔
2757
  } else {
2758
    code = mndAlterStbAndUpdateTagIdxImp(pMnode, pReq, pDb, &stbObj, needRsp, pReq->pCont, pReq->contLen, pAlter);
1,067✔
2759
  }
2760

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

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

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

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

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

2793
  pStb = mndAcquireStb(pMnode, alterReq.name);
6,319✔
2794
  if (pStb == NULL) {
6,319✔
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,295!
2800
    goto _OVER;
×
2801
  }
2802

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

2806
  SName   name = {0};
6,295✔
2807
  int32_t ret = 0;
6,295✔
2808
  if ((ret = tNameFromString(&name, alterReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0)
6,295!
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,295✔
2812

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

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

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

2825
static int32_t mndSetDropStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SStbObj *pStb) {
1,607✔
2826
  int32_t  code = 0;
1,607✔
2827
  SSdbRaw *pRedoRaw = mndStbActionEncode(pStb);
1,607✔
2828
  if (pRedoRaw == NULL) {
1,607!
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,607!
2834
    sdbFreeRaw(pRedoRaw);
×
2835
    TAOS_RETURN(code);
×
2836
  }
2837
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_DROPPING));
1,607!
2838

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

2842
static int32_t mndSetDropStbCommitLogs(SMnode *pMnode, STrans *pTrans, SStbObj *pStb) {
1,607✔
2843
  int32_t  code = 0;
1,607✔
2844
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
1,607✔
2845
  if (pCommitRaw == NULL) {
1,607!
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,607!
2851
    sdbFreeRaw(pCommitRaw);
×
2852
    TAOS_RETURN(code);
×
2853
  }
2854
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED));
1,607!
2855

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

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

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

2873
    int32_t contLen = 0;
3,400✔
2874
    void   *pReq = mndBuildVDropStbReq(pMnode, pVgroup, pStb, &contLen);
3,400✔
2875
    if (pReq == NULL) {
3,400!
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};
3,400✔
2883
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
3,400✔
2884
    action.pCont = pReq;
3,400✔
2885
    action.contLen = contLen;
3,400✔
2886
    action.msgType = TDMT_VND_DROP_STB;
3,400✔
2887
    action.acceptableCode = TSDB_CODE_TDB_STB_NOT_EXIST;
3,400✔
2888
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
3,400!
2889
      taosMemoryFree(pReq);
×
2890
      sdbCancelFetch(pSdb, pIter);
×
2891
      sdbRelease(pSdb, pVgroup);
×
2892
      TAOS_RETURN(code);
×
2893
    }
2894
    sdbRelease(pSdb, pVgroup);
3,400✔
2895
  }
2896

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

2900
static int32_t mndDropStb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb) {
1,607✔
2901
  int32_t code = -1;
1,607✔
2902
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "drop-stb");
1,607✔
2903
  if (pTrans == NULL) {
1,607!
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,607!
2910
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
1,607✔
2911
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
1,607!
2912

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

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

2927
static int32_t mndCheckDropStbForTopic(SMnode *pMnode, const char *stbFullName, int64_t suid) {
1,611✔
2928
  int32_t code = 0;
1,611✔
2929
  SSdb   *pSdb = pMnode->pSdb;
1,611✔
2930
  void   *pIter = NULL;
1,611✔
2931
  while (1) {
98✔
2932
    SMqTopicObj *pTopic = NULL;
1,709✔
2933
    pIter = sdbFetch(pSdb, SDB_TOPIC, pIter, (void **)&pTopic);
1,709✔
2934
    if (pIter == NULL) break;
1,709✔
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,611✔
2985
}
2986

2987
static int32_t mndCheckDropStbForStream(SMnode *pMnode, const char *stbFullName, int64_t suid) {
1,611✔
2988
  int32_t code = 0;
1,611✔
2989
  SSdb   *pSdb = pMnode->pSdb;
1,611✔
2990
  void   *pIter = NULL;
1,611✔
2991
  while (1) {
43✔
2992
    SStreamObj *pStream = NULL;
1,654✔
2993
    pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
1,654✔
2994
    if (pIter == NULL) break;
1,654✔
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,607✔
3038
}
3039

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

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

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

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

3055
  pStb = mndAcquireStb(pMnode, dropReq.name);
2,389✔
3056
  if (pStb == NULL) {
2,389✔
3057
    if (dropReq.igNotExists) {
778✔
3058
      mInfo("stb:%s, not exist, ignore not exist is set", dropReq.name);
775!
3059
      code = 0;
775✔
3060
      goto _OVER;
775✔
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,611!
3068
    code = 0;
×
3069
    goto _OVER;
×
3070
  }
3071

3072
  pDb = mndAcquireDbByStb(pMnode, dropReq.name);
1,611✔
3073
  if (pDb == NULL) {
1,611!
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,611!
3079
    goto _OVER;
×
3080
  }
3081

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

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

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

3095
  SName   name = {0};
1,607✔
3096
  int32_t ret = 0;
1,607✔
3097
  if ((ret = tNameFromString(&name, dropReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0)
1,607!
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,607✔
3101

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

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

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

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

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

3126
  if (0 == strcmp(infoReq.dbFName, TSDB_INFORMATION_SCHEMA_DB)) {
1,687,339✔
3127
    mInfo("information_schema table:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
243,648!
3128
    TAOS_CHECK_GOTO(mndBuildInsTableSchema(pMnode, infoReq.dbFName, infoReq.tbName, sysinfo, &metaRsp), NULL, _OVER);
243,648✔
3129
  } else if (0 == strcmp(infoReq.dbFName, TSDB_PERFORMANCE_SCHEMA_DB)) {
1,443,691✔
3130
    mInfo("performance_schema table:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
54,438!
3131
    TAOS_CHECK_GOTO(mndBuildPerfsTableSchema(pMnode, infoReq.dbFName, infoReq.tbName, &metaRsp), NULL, _OVER);
54,438✔
3132
  } else {
3133
    mInfo("stb:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
1,389,253✔
3134
    TAOS_CHECK_GOTO(mndBuildStbSchema(pMnode, infoReq.dbFName, infoReq.tbName, &metaRsp), NULL, _OVER);
1,389,326✔
3135
  }
3136

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

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

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

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

3159
_OVER:
1,668,051✔
3160
  if (code != 0) {
1,687,315✔
3161
    mError("stb:%s.%s, failed to retrieve meta since %s", infoReq.dbFName, infoReq.tbName, tstrerror(code));
3,684!
3162
  }
3163

3164
  mndReleaseUser(pMnode, pUser);
1,687,315✔
3165
  tFreeSTableMetaRsp(&metaRsp);
1,687,364✔
3166
  // TODO change to TAOS_RETURN
3167
  return code;
1,687,363✔
3168
}
3169

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

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

3178
  char dbName[TSDB_DB_NAME_LEN] = {0};
102✔
3179
  TAOS_CHECK_GOTO(mndExtractShortDbNameFromDbFullName(cfgReq.dbFName, dbName), NULL, _OVER);
102!
3180
  if (0 == strcmp(dbName, TSDB_INFORMATION_SCHEMA_DB)) {
102✔
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)) {
82✔
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);
72!
3188
    TAOS_CHECK_GOTO(mndBuildStbCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
72!
3189
  }
3190

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

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

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

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

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

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

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

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

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

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

3263
    if (schema) {
33,713✔
3264
      STableMetaRsp metaRsp = {0};
646✔
3265
      mInfo("stb:%s.%s, start to retrieve meta", pStbVersion->dbFName, pStbVersion->stbName);
646!
3266
      if (mndBuildStbSchema(pMnode, pStbVersion->dbFName, pStbVersion->stbName, &metaRsp) != 0) {
646!
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) {
1,292!
3280
        code = terrno;
×
3281
        return code;
×
3282
      }
3283
    }
3284

3285
    if (sma) {
33,713!
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);
26,511✔
3314
  if (rspLen < 0) {
26,511!
3315
    tFreeSSTbHbRsp(&hbRsp);
×
3316
    code = TSDB_CODE_INVALID_MSG;
×
3317
    TAOS_RETURN(code);
×
3318
  }
3319

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

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

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

3344
  int32_t numOfStbs = 0;
11,659✔
3345
  void   *pIter = NULL;
11,659✔
3346
  while (1) {
316,540✔
3347
    SStbObj *pStb = NULL;
328,199✔
3348
    pIter = sdbFetch(pSdb, SDB_STB, pIter, (void **)&pStb);
328,199✔
3349
    if (pIter == NULL) break;
328,199✔
3350

3351
    if (pStb->dbUid == pDb->uid) {
316,540✔
3352
      numOfStbs++;
141,870✔
3353
    }
3354

3355
    sdbRelease(pSdb, pStb);
316,540✔
3356
  }
3357

3358
  *pNumOfStbs = numOfStbs;
11,659✔
3359
  mndReleaseDb(pMnode, pDb);
11,659✔
3360
  TAOS_RETURN(code);
11,659✔
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) {
32✔
3373
  SName name = {0};
32✔
3374
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
32!
3375

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

3378
  return 0;
32✔
3379
}
3380

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

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

3387
  return 0;
102✔
3388
}
3389

3390
void mndExtractTbNameFromStbFullName(const char *stbFullName, char *dst, int32_t dstSize) {
1,742,569✔
3391
  int32_t pos = -1;
1,742,569✔
3392
  int32_t num = 0;
1,742,569✔
3393
  for (pos = 0; stbFullName[pos] != 0; ++pos) {
29,697,220!
3394
    if (stbFullName[pos] == TS_PATH_DELIMITER[0]) num++;
29,697,416✔
3395
    if (num == 2) break;
29,697,416✔
3396
  }
3397

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

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

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

3418
  while (numOfRows < rows) {
980,052✔
3419
    pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb);
972,470✔
3420
    if (pShow->pIter == NULL) break;
972,226✔
3421

3422
    if (pDb != NULL && pStb->dbUid != pDb->uid) {
961,568✔
3423
      sdbRelease(pSdb, pStb);
2,242✔
3424
      continue;
2,254✔
3425
    }
3426

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

3432
    cols = 0;
959,144✔
3433

3434
    SName name = {0};
959,144✔
3435

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

3442
    char db[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
953,162✔
3443
    RETRIEVE_CHECK_GOTO(tNameFromString(&name, pStb->db, T_NAME_ACCT | T_NAME_DB), pStb, &lino, _ERROR);
953,162!
3444
    RETRIEVE_CHECK_GOTO(tNameGetDbName(&name, varDataVal(db)), pStb, &lino, _ERROR);
958,845!
3445
    varDataSetLen(db, strlen(varDataVal(db)));
958,924✔
3446
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
958,924✔
3447
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)db, false), pStb, &lino, _ERROR);
954,727!
3448

3449
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
950,385✔
3450
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->createdTime, false), pStb, &lino,
947,091!
3451
                        _ERROR);
3452

3453
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
945,168✔
3454
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->numOfColumns, false), pStb, &lino,
942,241!
3455
                        _ERROR);
3456

3457
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
943,430✔
3458
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->numOfTags, false), pStb, &lino, _ERROR);
940,475!
3459

3460
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
942,226✔
3461
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->updateTime, false), pStb, &lino,
939,670!
3462
                        _ERROR);  // number of tables
3463

3464
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
943,162✔
3465
    if (pStb->commentLen > 0) {
940,033!
3466
      char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
×
3467
      STR_TO_VARSTR(comment, pStb->comment);
×
3468
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, comment, false), pStb, &lino, _ERROR);
×
3469
    } else if (pStb->commentLen == 0) {
941,145✔
3470
      char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
28,105✔
3471
      STR_TO_VARSTR(comment, "");
28,105✔
3472
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, comment, false), pStb, &lino, _ERROR);
28,105!
3473
    } else {
3474
      colDataSetNULL(pColInfo, numOfRows);
913,040!
3475
    }
3476

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

3482
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
958,610✔
3483
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)watermark, false), pStb, &lino, _ERROR);
951,953!
3484

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

3490
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
958,756✔
3491
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)maxDelay, false), pStb, &lino, _ERROR);
952,366!
3492

3493
    char    rollup[160 + VARSTR_HEADER_SIZE] = {0};
948,786✔
3494
    int32_t rollupNum = (int32_t)taosArrayGetSize(pStb->pFuncs);
948,786✔
3495
    char   *sep = ", ";
952,630✔
3496
    int32_t sepLen = strlen(sep);
952,630✔
3497
    int32_t rollupLen = sizeof(rollup) - VARSTR_HEADER_SIZE - 2;
952,630✔
3498
    for (int32_t i = 0; i < rollupNum; ++i) {
952,634✔
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)));
952,630✔
3508

3509
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
952,630✔
3510
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)rollup, false), pStb, &lino, _ERROR);
951,481!
3511

3512
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
947,066✔
3513
    if (pColInfo) {
942,805!
3514
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->uid), false), pStb, &lino, _ERROR);
943,008!
3515
    }
3516

3517
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
940,924✔
3518
    if (pColInfo) {
937,500!
3519
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->virtualStb), false), pStb, &lino, _ERROR);
937,589!
3520
    }
3521

3522
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
939,442✔
3523
    if (pColInfo) {
935,984!
3524
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->keep), false), pStb, &lino, _ERROR);
935,997!
3525
    }
3526

3527
    numOfRows++;
940,280✔
3528
    sdbRelease(pSdb, pStb);
940,280✔
3529
  }
3530

3531
  if (pDb != NULL) {
18,240✔
3532
    mndReleaseDb(pMnode, pDb);
1,154✔
3533
  }
3534

3535
  goto _OVER;
18,213✔
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;
18,213✔
3543
  return numOfRows;
18,213✔
3544
}
3545

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

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

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

3567
    STR_TO_VARSTR(tName, pm->name);
619,500✔
3568

3569
    for (int32_t j = 0; j < pm->colNum; j++) {
6,102,318✔
3570
      // table name
3571
      SColumnInfoData *pColInfoData = taosArrayGet(p->pDataBlock, 0);
5,527,576✔
3572
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, tName, false), &lino, _OVER);
5,512,533!
3573

3574
      // database name
3575
      pColInfoData = taosArrayGet(p->pDataBlock, 1);
5,510,743✔
3576
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, dName, false), &lino, _OVER);
5,496,817!
3577

3578
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
5,506,807✔
3579
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, typeName, false), &lino, _OVER);
5,494,613!
3580

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

3587
      // col type
3588
      int8_t colType = pm->schema[j].type;
5,513,948✔
3589
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
5,513,948✔
3590
      char colTypeStr[VARSTR_HEADER_SIZE + 32];
3591
      int  colTypeLen =
5,563,009✔
3592
          tsnprintf(varDataVal(colTypeStr), sizeof(colTypeStr) - VARSTR_HEADER_SIZE, "%s", tDataTypes[colType].name);
5,502,983✔
3593
      if (colType == TSDB_DATA_TYPE_VARCHAR) {
5,563,009✔
3594
        colTypeLen +=
3,042,132✔
3595
            tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d)",
3,041,949✔
3596
                      (int32_t)(pm->schema[j].bytes - VARSTR_HEADER_SIZE));
3,041,949✔
3597
      } else if (colType == TSDB_DATA_TYPE_NCHAR) {
2,521,060!
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,563,192✔
3603
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, (char *)colTypeStr, false), &lino, _OVER);
5,563,192!
3604

3605
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
5,522,019✔
3606
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, (const char *)&pm->schema[j].bytes, false), &lino, _OVER);
5,509,484!
3607
      for (int32_t k = 6; k <= 9; ++k) {
27,308,146✔
3608
        pColInfoData = taosArrayGet(p->pDataBlock, k);
21,825,328✔
3609
        colDataSetNULL(pColInfoData, numOfRows);
21,795,841✔
3610
      }
3611

3612
      numOfRows += 1;
5,482,818✔
3613
    }
3614
  }
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,094✔
3626
  size_t               size = 0;
14,094✔
3627
  const SSysTableMeta *pSysDbTableMeta = NULL;
14,094✔
3628

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

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

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

3642
static int8_t determineBuildColForWhichDBs(const char *db) {
14,118✔
3643
  int8_t buildWhichDBs;
3644
  if (!db[0])
14,118✔
3645
    buildWhichDBs = BUILD_COL_FOR_ALL_DB;
14,086✔
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,118✔
3657
}
3658

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

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

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

3676
  if (buildWhichDBs & BUILD_COL_FOR_USER_DB) {
14,119✔
3677
    SDbObj *pDb = NULL;
14,117✔
3678
    if (strlen(pShow->db) > 0) {
14,117✔
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,117✔
3684
    STR_TO_VARSTR(typeName, "SUPER_TABLE");
14,117✔
3685
    bool fetch = pShow->restore ? false : true;
14,117✔
3686
    pShow->restore = false;
14,117✔
3687
    while (numOfRows < rows) {
797,314!
3688
      if (fetch) {
797,314✔
3689
        pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb);
797,290✔
3690
        if (pShow->pIter == NULL) break;
797,304✔
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) {
783,211✔
3699
        sdbRelease(pSdb, pStb);
12✔
3700
        continue;
12✔
3701
      }
3702

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

3711
      if ((numOfRows + pStb->numOfColumns) > rows) {
783,200✔
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]));
783,176✔
3722

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

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

3730
      for (int i = 0; i < pStb->numOfColumns; i++) {
18,022,908✔
3731
        int32_t          cols = 0;
18,010,463✔
3732
        SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
18,010,463✔
3733
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stbName, false), pStb, &lino, _OVER);
17,684,227!
3734

3735
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
18,167,377✔
3736
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)db, false), pStb, &lino, _OVER);
17,659,023!
3737

3738
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
17,919,803✔
3739
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, typeName, false), pStb, &lino, _OVER);
17,591,552!
3740

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

3747
        // col type
3748
        int8_t colType = pStb->pColumns[i].type;
17,962,720✔
3749
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
17,962,720✔
3750
        char colTypeStr[VARSTR_HEADER_SIZE + 32];
3751
        int  colTypeLen =
18,527,365✔
3752
            tsnprintf(varDataVal(colTypeStr), sizeof(colTypeStr) - VARSTR_HEADER_SIZE, "%s", tDataTypes[colType].name);
17,649,258✔
3753
        if (colType == TSDB_DATA_TYPE_VARCHAR) {
18,527,365✔
3754
          colTypeLen +=
1,456,286✔
3755
              tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE,
1,456,121✔
3756
                        "(%d)", (int32_t)(pStb->pColumns[i].bytes - VARSTR_HEADER_SIZE));
1,456,121✔
3757
        } else if (colType == TSDB_DATA_TYPE_NCHAR) {
17,071,244✔
3758
          colTypeLen +=
1,470,824✔
3759
              tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE,
1,470,644✔
3760
                        "(%d)", (int32_t)((pStb->pColumns[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
1,470,644✔
3761
        } else if (IS_DECIMAL_TYPE(colType)) {
15,600,600!
3762
          STypeMod typeMod = pStb->pExtSchemas[i].typeMod;
×
3763
          uint8_t prec = 0, scale = 0;
×
3764
          decimalFromTypeMod(typeMod, &prec, &scale);
×
3765
          colTypeLen += sprintf(varDataVal(colTypeStr) + colTypeLen, "(%d,%d)", prec, scale);
×
3766
        }
3767
        varDataSetLen(colTypeStr, colTypeLen);
18,530,407✔
3768
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (char *)colTypeStr, false), pStb, &lino, _OVER);
18,530,407!
3769

3770
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
18,182,770✔
3771
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->pColumns[i].bytes, false), pStb,
17,730,320!
3772
                            &lino, _OVER);
3773
        while (cols < pShow->numOfColumns) {
84,381,251✔
3774
          pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
67,141,519✔
3775
          colDataSetNULL(pColInfo, numOfRows);
66,484,332✔
3776
        }
3777
        numOfRows++;
17,239,732✔
3778
      }
3779

3780
      sdbRelease(pSdb, pStb);
12,445✔
3781
    }
3782

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

3788
  mDebug("mndRetrieveStbCol success, rows:%d, pShow->numOfRows:%d", numOfRows, pShow->numOfRows);
14,119✔
3789
  goto _OVER;
14,119✔
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,119✔
3796
  pShow->numOfRows += numOfRows;
14,119✔
3797
  return numOfRows;
14,119✔
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,277✔
3806
  char *posDb = strstr(src, TS_PATH_DELIMITER);
35,277✔
3807
  if (posDb != NULL) ++posDb;
35,277!
3808
  if (posDb == NULL) return src;
35,277!
3809

3810
  char *posStb = strstr(posDb, TS_PATH_DELIMITER);
35,277✔
3811
  if (posStb != NULL) ++posStb;
35,277!
3812
  if (posStb == NULL) return posDb;
35,277!
3813
  return posStb;
35,277✔
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) {
33✔
3987
  if (!p) return;
33!
3988

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

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

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

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

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

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

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

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

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

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

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

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

4060
static int32_t mndBuildDropTbRedoActions(SMnode *pMnode, STrans *pTrans, SHashObj *pVgMap, tmsg_t msgType) {
23✔
4061
  int32_t code = 0;
23✔
4062
  void   *pIter = taosHashIterate(pVgMap, NULL);
23✔
4063
  while (pIter) {
46✔
4064
    const SVDropTbVgReqs *pVgReqs = pIter;
23✔
4065
    int32_t               len = 0;
23✔
4066
    for (int32_t i = 0; i < taosArrayGetSize(pVgReqs->pBatchReqs) && code == TSDB_CODE_SUCCESS; ++i) {
115!
4067
      SVDropTbBatchReq *pBatchReq = taosArrayGet(pVgReqs->pBatchReqs, i);
92✔
4068
      void             *p = mndBuildVDropTbsReq(pMnode, &pVgReqs->info, pBatchReq, &len);
92✔
4069
      if (!p) {
92!
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) {
92!
4075
        break;
×
4076
      }
4077
    }
4078
    if (TSDB_CODE_SUCCESS != code) {
23!
4079
      taosHashCancelIterate(pVgMap, pIter);
×
4080
      break;
×
4081
    }
4082
    pIter = taosHashIterate(pVgMap, pIter);
23✔
4083
  }
4084
  return code;
23✔
4085
}
4086

4087
static int32_t mndCreateDropTbsTxnPrepare(SRpcMsg *pRsp, SMndDropTbsWithTsmaCtx *pCtx) {
33✔
4088
  int32_t code = 0;
33✔
4089
  SMnode *pMnode = pRsp->info.node;
33✔
4090
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, pRsp, "drop-tbs");
33✔
4091
  mndTransSetChangeless(pTrans);
33✔
4092
  mndTransSetSerial(pTrans);
33✔
4093
  if (pTrans == NULL) {
33!
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);
33✔
4100

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

4104
_OVER:
23✔
4105
  mndTransDrop(pTrans);
33✔
4106
  TAOS_RETURN(code);
33✔
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) {
136✔
4140
  pBatchReq->nReqs = 1;
136✔
4141
  pBatchReq->pArray = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SVDropTbReq));
136✔
4142
  if (!pBatchReq->pArray) return terrno;
136!
4143
  if (taosArrayPush(pBatchReq->pArray, pReq) == NULL) {
272!
4144
    taosArrayDestroy(pBatchReq->pArray);
×
4145
    pBatchReq->pArray = NULL;
×
4146
    return terrno;
×
4147
  }
4148
  return TSDB_CODE_SUCCESS;
136✔
4149
}
4150

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

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

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

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

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

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

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

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

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

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

© 2026 Coveralls, Inc