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

taosdata / TDengine / #4811

16 Oct 2025 11:40AM UTC coverage: 58.693% (+0.2%) from 58.518%
#4811

push

travis-ci

web-flow
fix(tref): increase TSDB_REF_OBJECTS from 100 to 2000 for improved reference handling (#33281)

139835 of 303532 branches covered (46.07%)

Branch coverage included in aggregate %.

211576 of 295200 relevant lines covered (71.67%)

16841075.92 hits per line

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

65.09
/source/dnode/mnode/impl/src/mndStb.c
1
/*
2
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
3
 *
4
 * This program is free software: you can use, redistribute, and/or modify
5
 * it under the terms of the GNU Affero General Public License, version 3
6
 * or later ("AGPL"), as published by the Free Software Foundation.
7
 *
8
 * This program is distributed in the hope that it will be useful, but WITHOUT
9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
 * FITNESS FOR A PARTICULAR PURPOSE.
11
 *
12
 * You should have received a copy of the GNU Affero General Public License
13
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14
 */
15

16
#define _DEFAULT_SOURCE
17
#include "audit.h"
18
#include "mndDb.h"
19
#include "mndDnode.h"
20
#include "mndIndex.h"
21
#include "mndIndexComm.h"
22
#include "mndInfoSchema.h"
23
#include "mndMnode.h"
24
#include "mndPerfSchema.h"
25
#include "mndPrivilege.h"
26
#include "mndRsma.h"
27
#include "mndShow.h"
28
#include "mndSma.h"
29
#include "mndStb.h"
30
#include "mndTopic.h"
31
#include "mndTrans.h"
32
#include "mndUser.h"
33
#include "mndVgroup.h"
34
#include "mndStream.h"
35
#include "tname.h"
36

37
#define STB_VER_NUMBER   3
38
#define STB_RESERVE_SIZE 56
39

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  mndProcessCreateStbReq(SRpcMsg *pReq);
46
static int32_t  mndProcessAlterStbReq(SRpcMsg *pReq);
47
static int32_t  mndProcessDropStbReq(SRpcMsg *pReq);
48
static int32_t  mndProcessDropTtltbRsp(SRpcMsg *pReq);
49
static int32_t  mndProcessTableMetaReq(SRpcMsg *pReq);
50
static int32_t  mndRetrieveStb(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
51
static int32_t  mndRetrieveStbCol(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
52
static void     mndCancelGetNextStb(SMnode *pMnode, void *pIter);
53
static int32_t  mndProcessTableCfgReq(SRpcMsg *pReq);
54
static int32_t  mndAlterStbImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
55
                               void *alterOriData, int32_t alterOriDataLen);
56
static int32_t  mndAlterStbAndUpdateTagIdxImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
57
                                              void *alterOriData, int32_t alterOriDataLen, const SMAlterStbReq *pAlter);
58

59
static int32_t mndProcessCreateIndexReq(SRpcMsg *pReq);
60
static int32_t mndProcessDropIndexReq(SRpcMsg *pReq);
61

62
static int32_t mndProcessDropStbReqFromMNode(SRpcMsg *pReq);
63
static int32_t mndProcessDropTbWithTsma(SRpcMsg *pReq);
64
static int32_t mndProcessFetchTtlExpiredTbs(SRpcMsg *pReq);
65

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

77
  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_STB, mndProcessCreateStbReq);
1,352✔
78
  mndSetMsgHandle(pMnode, TDMT_MND_ALTER_STB, mndProcessAlterStbReq);
1,352✔
79
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_STB, mndProcessDropStbReq);
1,352✔
80
  mndSetMsgHandle(pMnode, TDMT_VND_CREATE_STB_RSP, mndTransProcessRsp);
1,352✔
81
  mndSetMsgHandle(pMnode, TDMT_VND_DROP_TTL_TABLE_RSP, mndProcessDropTtltbRsp);
1,352✔
82
  mndSetMsgHandle(pMnode, TDMT_VND_TRIM_RSP, mndTransProcessRsp);
1,352✔
83
  mndSetMsgHandle(pMnode, TDMT_VND_ALTER_STB_RSP, mndTransProcessRsp);
1,352✔
84
  mndSetMsgHandle(pMnode, TDMT_VND_DROP_STB_RSP, mndTransProcessRsp);
1,352✔
85
  mndSetMsgHandle(pMnode, TDMT_MND_TABLE_META, mndProcessTableMetaReq);
1,352✔
86
  mndSetMsgHandle(pMnode, TDMT_MND_TTL_TIMER, mndProcessTtlTimer);
1,352✔
87
  // mndSetMsgHandle(pMnode, TDMT_MND_TRIM_DB_TIMER, mndProcessTrimDbTimer);
88
  mndSetMsgHandle(pMnode, TDMT_MND_TABLE_CFG, mndProcessTableCfgReq);
1,352✔
89
  mndSetMsgHandle(pMnode, TDMT_MND_STB_DROP, mndProcessDropStbReqFromMNode);
1,352✔
90
  mndSetMsgHandle(pMnode, TDMT_MND_STB_DROP_RSP, mndTransProcessRsp);
1,352✔
91
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_TB_WITH_TSMA, mndProcessDropTbWithTsma);
1,352✔
92
  mndSetMsgHandle(pMnode, TDMT_VND_FETCH_TTL_EXPIRED_TBS_RSP, mndProcessFetchTtlExpiredTbs);
1,352✔
93
  mndSetMsgHandle(pMnode, TDMT_VND_DROP_TABLE_RSP, mndTransProcessRsp);
1,352✔
94
  //  mndSetMsgHandle(pMnode, TDMT_MND_SYSTABLE_RETRIEVE, mndProcessRetrieveStbReq);
95

96
  // mndSetMsgHandle(pMnode, TDMT_MND_CREATE_INDEX, mndProcessCreateIndexReq);
97
  // mndSetMsgHandle(pMnode, TDMT_MND_DROP_INDEX, mndProcessDropIndexReq);
98
  // mndSetMsgHandle(pMnode, TDMT_VND_CREATE_INDEX_RSP, mndTransProcessRsp);
99
  // mndSetMsgHandle(pMnode, TDMT_VND_DROP_INDEX_RSP, mndTransProcessRsp);
100

101
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STB, mndRetrieveStb);
1,352✔
102
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_STB, mndCancelGetNextStb);
1,352✔
103

104
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_COL, mndRetrieveStbCol);
1,352✔
105
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_COL, mndCancelGetNextStb);
1,352✔
106

107
  return sdbSetTable(pMnode->pSdb, table);
1,352✔
108
}
109

110
void mndCleanupStb(SMnode *pMnode) {}
1,351✔
111

112
SSdbRaw *mndStbActionEncode(SStbObj *pStb) {
48,613✔
113
  int32_t code = 0;
48,613✔
114
  int32_t lino = 0;
48,613✔
115
  bool    hasTypeMod = false;
48,613✔
116
  terrno = TSDB_CODE_OUT_OF_MEMORY;
48,613✔
117

118
  int32_t size = sizeof(SStbObj) + (pStb->numOfColumns + pStb->numOfTags) * sizeof(SSchema) + pStb->commentLen +
97,226✔
119
                 pStb->ast1Len + pStb->ast2Len + pStb->numOfColumns * sizeof(SColCmpr) + STB_RESERVE_SIZE +
97,226✔
120
                 taosArrayGetSize(pStb->pFuncs) * TSDB_FUNC_NAME_LEN + sizeof(int32_t) * pStb->numOfColumns;
48,613✔
121
  SSdbRaw *pRaw = sdbAllocRaw(SDB_STB, STB_VER_NUMBER, size);
48,613✔
122
  if (pRaw == NULL) goto _OVER;
48,613!
123

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

147
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
2,998,540✔
148
    SSchema *pSchema = &pStb->pColumns[i];
2,949,927✔
149
    SDB_SET_INT8(pRaw, dataPos, pSchema->type, _OVER)
2,949,927!
150
    SDB_SET_INT8(pRaw, dataPos, pSchema->flags, _OVER)
2,949,927!
151
    SDB_SET_INT16(pRaw, dataPos, pSchema->colId, _OVER)
2,949,927!
152
    SDB_SET_INT32(pRaw, dataPos, pSchema->bytes, _OVER)
2,949,927!
153
    SDB_SET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
2,949,927!
154
    hasTypeMod = hasTypeMod || HAS_TYPE_MOD(pSchema);
2,949,927✔
155
  }
156

157
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
467,771✔
158
    SSchema *pSchema = &pStb->pTags[i];
419,158✔
159
    SDB_SET_INT8(pRaw, dataPos, pSchema->type, _OVER)
419,158!
160
    SDB_SET_INT8(pRaw, dataPos, pSchema->flags, _OVER)
419,158!
161
    SDB_SET_INT16(pRaw, dataPos, pSchema->colId, _OVER)
419,158!
162
    SDB_SET_INT32(pRaw, dataPos, pSchema->bytes, _OVER)
419,158!
163
    SDB_SET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
419,158!
164
  }
165

166
  for (int32_t i = 0; i < pStb->numOfFuncs; ++i) {
48,613!
167
    char *func = taosArrayGet(pStb->pFuncs, i);
×
168
    SDB_SET_BINARY(pRaw, dataPos, func, TSDB_FUNC_NAME_LEN, _OVER)
×
169
  }
170

171
  if (pStb->commentLen > 0) {
48,613✔
172
    SDB_SET_BINARY(pRaw, dataPos, pStb->comment, pStb->commentLen + 1, _OVER)
137!
173
  }
174

175
  if (pStb->ast1Len > 0) {
48,613!
176
    SDB_SET_BINARY(pRaw, dataPos, pStb->pAst1, pStb->ast1Len, _OVER)
×
177
  }
178

179
  if (pStb->ast2Len > 0) {
48,613!
180
    SDB_SET_BINARY(pRaw, dataPos, pStb->pAst2, pStb->ast2Len, _OVER)
×
181
  }
182

183
  if (pStb->pCmpr != NULL) {
48,613!
184
    for (int i = 0; i < pStb->numOfColumns; i++) {
2,998,540✔
185
      SColCmpr *p = &pStb->pCmpr[i];
2,949,927✔
186
      SDB_SET_INT16(pRaw, dataPos, p->id, _OVER)
2,949,927!
187
      SDB_SET_INT32(pRaw, dataPos, p->alg, _OVER)
2,949,927!
188
    }
189
  }
190
  SDB_SET_INT64(pRaw, dataPos, pStb->keep, _OVER)
48,613!
191

192
  if (hasTypeMod) {
48,613✔
193
    for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
2,415,359✔
194
      SDB_SET_INT32(pRaw, dataPos, pStb->pExtSchemas[i].typeMod, _OVER);
2,404,282!
195
    }
196
  }
197

198
  SDB_SET_INT8(pRaw, dataPos, pStb->virtualStb, _OVER)
48,613!
199
  SDB_SET_RESERVE(pRaw, dataPos, STB_RESERVE_SIZE, _OVER)
48,613!
200
  SDB_SET_DATALEN(pRaw, dataPos, _OVER)
48,613!
201

202
  terrno = 0;
48,613✔
203

204
_OVER:
48,613✔
205
  if (terrno != 0) {
48,613!
206
    mError("stb:%s, failed to encode to raw:%p since %s", pStb->name, pRaw, terrstr());
×
207
    sdbFreeRaw(pRaw);
×
208
    return NULL;
×
209
  }
210

211
  mTrace("stb:%s, encode to raw:%p, row:%p", pStb->name, pRaw, pStb);
48,613✔
212
  return pRaw;
48,613✔
213
}
214

215
SSdbRow *mndStbActionDecode(SSdbRaw *pRaw) {
42,787✔
216
  int32_t code = 0;
42,787✔
217
  int32_t lino = 0;
42,787✔
218
  terrno = TSDB_CODE_OUT_OF_MEMORY;
42,787✔
219
  SSdbRow *pRow = NULL;
42,787✔
220
  SStbObj *pStb = NULL;
42,787✔
221
  bool     hasExtSchemas = false;
42,787✔
222

223
  int8_t sver = 0;
42,787✔
224
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
42,787!
225

226
  if (sver > STB_VER_NUMBER) {
42,787!
227
    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
×
228
    goto _OVER;
×
229
  }
230

231
  pRow = sdbAllocRow(sizeof(SStbObj));
42,787✔
232
  if (pRow == NULL) goto _OVER;
42,787!
233

234
  pStb = sdbGetRowObj(pRow);
42,787✔
235
  if (pStb == NULL) goto _OVER;
42,787!
236

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

260
  pStb->pColumns = taosMemoryCalloc(pStb->numOfColumns, sizeof(SSchema));
42,787!
261
  pStb->pTags = taosMemoryCalloc(pStb->numOfTags, sizeof(SSchema));
42,787!
262
  pStb->pFuncs = taosArrayInit(pStb->numOfFuncs, TSDB_FUNC_NAME_LEN);
42,787✔
263
  if (pStb->pColumns == NULL || pStb->pTags == NULL || pStb->pFuncs == NULL) {
42,787!
264
    goto _OVER;
×
265
  }
266

267
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
7,014,567✔
268
    SSchema *pSchema = &pStb->pColumns[i];
6,971,780✔
269
    SDB_GET_INT8(pRaw, dataPos, &pSchema->type, _OVER)
6,971,780!
270
    SDB_GET_INT8(pRaw, dataPos, &pSchema->flags, _OVER)
6,971,780!
271
    SDB_GET_INT16(pRaw, dataPos, &pSchema->colId, _OVER)
6,971,780!
272
    SDB_GET_INT32(pRaw, dataPos, &pSchema->bytes, _OVER)
6,971,780!
273
    SDB_GET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
6,971,780!
274
    hasExtSchemas = hasExtSchemas || HAS_TYPE_MOD(pSchema);
6,971,780✔
275
  }
276

277
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
692,036✔
278
    SSchema *pSchema = &pStb->pTags[i];
649,249✔
279
    SDB_GET_INT8(pRaw, dataPos, &pSchema->type, _OVER)
649,249!
280
    SDB_GET_INT8(pRaw, dataPos, &pSchema->flags, _OVER)
649,249!
281
    SDB_GET_INT16(pRaw, dataPos, &pSchema->colId, _OVER)
649,249!
282
    SDB_GET_INT32(pRaw, dataPos, &pSchema->bytes, _OVER)
649,249!
283
    SDB_GET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
649,249!
284
  }
285

286
  for (int32_t i = 0; i < pStb->numOfFuncs; ++i) {
42,787!
287
    char funcName[TSDB_FUNC_NAME_LEN] = {0};
×
288
    SDB_GET_BINARY(pRaw, dataPos, funcName, TSDB_FUNC_NAME_LEN, _OVER)
×
289
    if (taosArrayPush(pStb->pFuncs, funcName) == NULL) goto _OVER;
×
290
  }
291

292
  if (pStb->commentLen > 0) {
42,787✔
293
    pStb->comment = taosMemoryCalloc(pStb->commentLen + 1, 1);
132!
294
    if (pStb->comment == NULL) goto _OVER;
132!
295
    SDB_GET_BINARY(pRaw, dataPos, pStb->comment, pStb->commentLen + 1, _OVER)
132!
296
  }
297

298
  if (pStb->ast1Len > 0) {
42,787!
299
    pStb->pAst1 = taosMemoryCalloc(pStb->ast1Len, 1);
×
300
    if (pStb->pAst1 == NULL) goto _OVER;
×
301
    SDB_GET_BINARY(pRaw, dataPos, pStb->pAst1, pStb->ast1Len, _OVER)
×
302
  }
303

304
  if (pStb->ast2Len > 0) {
42,787!
305
    pStb->pAst2 = taosMemoryCalloc(pStb->ast2Len, 1);
×
306
    if (pStb->pAst2 == NULL) goto _OVER;
×
307
    SDB_GET_BINARY(pRaw, dataPos, pStb->pAst2, pStb->ast2Len, _OVER)
×
308
  }
309

310
  pStb->pCmpr = taosMemoryCalloc(pStb->numOfColumns, sizeof(SColCmpr));
42,787!
311
  if (sver < STB_VER_NUMBER - 1) {
42,787!
312
    // compatible with old data, setup default compress value
313
    // impl later
314
    for (int i = 0; i < pStb->numOfColumns; i++) {
×
315
      SSchema  *pSchema = &pStb->pColumns[i];
×
316
      SColCmpr *pCmpr = &pStb->pCmpr[i];
×
317
      pCmpr->id = pSchema->colId;
×
318
      pCmpr->alg = createDefaultColCmprByType(pSchema->type);
×
319
    }
320
  } else {
321
    for (int i = 0; i < pStb->numOfColumns; i++) {
7,014,567✔
322
      SColCmpr *pCmpr = &pStb->pCmpr[i];
6,971,780✔
323
      SDB_GET_INT16(pRaw, dataPos, &pCmpr->id, _OVER)
6,971,780!
324
      SDB_GET_INT32(pRaw, dataPos, (int32_t *)&pCmpr->alg, _OVER)  // compatiable
6,971,780!
325
    }
326
  }
327
  SDB_GET_INT64(pRaw, dataPos, &pStb->keep, _OVER)
42,787!
328

329
  // type mod
330
  if (hasExtSchemas) {
42,787✔
331
    pStb->pExtSchemas = taosMemoryCalloc(pStb->numOfColumns, sizeof(SExtSchema));
19,174!
332
    if (!pStb->pExtSchemas) goto _OVER;
19,174!
333
    for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
6,645,416✔
334
      SSchema *pSchema = &pStb->pColumns[i];
6,626,242✔
335
      SDB_GET_INT32(pRaw, dataPos, &pStb->pExtSchemas[i].typeMod, _OVER)
6,626,242!
336
    }
337
  }
338

339
  if (sver < STB_VER_NUMBER) {
42,787!
340
    pStb->virtualStb = 0;
×
341
  } else {
342
    SDB_GET_INT8(pRaw, dataPos, &pStb->virtualStb, _OVER)
42,787!
343
  }
344

345
  SDB_GET_RESERVE(pRaw, dataPos, STB_RESERVE_SIZE, _OVER)
42,787!
346

347
  terrno = 0;
42,787✔
348

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

363
  mTrace("stb:%s, decode from raw:%p, row:%p", pStb->name, pRaw, pStb);
42,787✔
364
  return pRow;
42,787✔
365
}
366

367
void mndFreeStb(SStbObj *pStb) {
49,406✔
368
  taosArrayDestroy(pStb->pFuncs);
49,406✔
369
  taosMemoryFreeClear(pStb->pColumns);
49,406!
370
  taosMemoryFreeClear(pStb->pTags);
49,406!
371
  taosMemoryFreeClear(pStb->comment);
49,406!
372
  taosMemoryFreeClear(pStb->pAst1);
49,406!
373
  taosMemoryFreeClear(pStb->pAst2);
49,406!
374
  taosMemoryFreeClear(pStb->pCmpr);
49,406!
375
  taosMemoryFreeClear(pStb->pExtSchemas);
49,406!
376
}
49,406✔
377

378
static int32_t mndStbActionInsert(SSdb *pSdb, SStbObj *pStb) {
10,885✔
379
  mTrace("stb:%s, perform insert action, row:%p", pStb->name, pStb);
10,885✔
380
  return 0;
10,885✔
381
}
382

383
static int32_t mndStbActionDelete(SSdb *pSdb, SStbObj *pStb) {
49,198✔
384
  mTrace("stb:%s, perform delete action, row:%p", pStb->name, pStb);
49,198✔
385
  mndFreeStb(pStb);
49,198✔
386
  return 0;
49,198✔
387
}
388

389
static int32_t mndStbActionUpdate(SSdb *pSdb, SStbObj *pOld, SStbObj *pNew) {
28,451✔
390
  terrno = 0;
28,451✔
391
  mTrace("stb:%s, perform update action, old row:%p new row:%p", pOld->name, pOld, pNew);
28,451✔
392

393
  taosWLockLatch(&pOld->lock);
28,451✔
394
  int32_t numOfColumns = pOld->numOfColumns;
28,451✔
395
  if (pOld->numOfColumns < pNew->numOfColumns) {
28,451✔
396
    void *pColumns = taosMemoryMalloc(pNew->numOfColumns * sizeof(SSchema));
6,178!
397
    if (pColumns == NULL) {
6,178!
398
      goto END;
×
399
    }
400
    taosMemoryFree(pOld->pColumns);
6,178!
401
    pOld->pColumns = pColumns;
6,178✔
402
  }
403

404
  if (pOld->numOfTags < pNew->numOfTags) {
28,451✔
405
    void *pTags = taosMemoryMalloc(pNew->numOfTags * sizeof(SSchema));
1,032!
406
    if (pTags == NULL) {
1,032!
407
      goto END;
×
408
    }
409
    taosMemoryFree(pOld->pTags);
1,032!
410
    pOld->pTags = pTags;
1,032✔
411
  }
412

413
  if (pOld->commentLen < pNew->commentLen && pNew->commentLen > 0) {
28,451✔
414
    void *comment = taosMemoryMalloc(pNew->commentLen + 1);
10!
415
    if (comment == NULL) {
10!
416
      goto END;
×
417
    }
418
    taosMemoryFree(pOld->comment);
10!
419
    pOld->comment = comment;
10✔
420
  }
421
  pOld->commentLen = pNew->commentLen;
28,451✔
422

423
  if (pOld->ast1Len < pNew->ast1Len) {
28,451!
424
    void *pAst1 = taosMemoryMalloc(pNew->ast1Len + 1);
×
425
    if (pAst1 == NULL) {
×
426
      goto END;
×
427
    }
428
    taosMemoryFree(pOld->pAst1);
×
429
    pOld->pAst1 = pAst1;
×
430
  }
431

432
  if (pOld->ast2Len < pNew->ast2Len) {
28,451!
433
    void *pAst2 = taosMemoryMalloc(pNew->ast2Len + 1);
×
434
    if (pAst2 == NULL) {
×
435
      goto END;
×
436
    }
437
    taosMemoryFree(pOld->pAst2);
×
438
    pOld->pAst2 = pAst2;
×
439
  }
440

441
  pOld->updateTime = pNew->updateTime;
28,451✔
442
  pOld->tagVer = pNew->tagVer;
28,451✔
443
  pOld->colVer = pNew->colVer;
28,451✔
444
  pOld->smaVer = pNew->smaVer;
28,451✔
445
  pOld->nextColId = pNew->nextColId;
28,451✔
446
  pOld->ttl = pNew->ttl;
28,451✔
447
  pOld->keep = pNew->keep;
28,451✔
448
  
449
  if (pNew->numOfColumns > 0) {
28,451!
450
    pOld->numOfColumns = pNew->numOfColumns;
28,451✔
451
    memcpy(pOld->pColumns, pNew->pColumns, pOld->numOfColumns * sizeof(SSchema));
28,451✔
452
  }
453
  if (pNew->numOfTags > 0) {
28,451!
454
    pOld->numOfTags = pNew->numOfTags;
28,451✔
455
    memcpy(pOld->pTags, pNew->pTags, pOld->numOfTags * sizeof(SSchema));
28,451✔
456
  }
457
  if (pNew->commentLen > 0) {
28,451✔
458
    memcpy(pOld->comment, pNew->comment, pNew->commentLen + 1);
97✔
459
    pOld->commentLen = pNew->commentLen;
97✔
460
  }
461
  if (pNew->ast1Len != 0) {
28,451!
462
    memcpy(pOld->pAst1, pNew->pAst1, pNew->ast1Len);
×
463
    pOld->ast1Len = pNew->ast1Len;
×
464
  }
465
  if (pNew->ast2Len != 0) {
28,451!
466
    memcpy(pOld->pAst2, pNew->pAst2, pNew->ast2Len);
×
467
    pOld->ast2Len = pNew->ast2Len;
×
468
  }
469
  if (numOfColumns < pNew->numOfColumns) {
28,451✔
470
    taosMemoryFree(pOld->pCmpr);
6,178!
471
    pOld->pCmpr = taosMemoryCalloc(pNew->numOfColumns, sizeof(SColCmpr));
6,178!
472
    if (pOld->pCmpr == NULL){
6,178!
473
      goto END;
×
474
    }
475
    memcpy(pOld->pCmpr, pNew->pCmpr, pNew->numOfColumns * sizeof(SColCmpr));
6,178✔
476
  } else {
477
    memcpy(pOld->pCmpr, pNew->pCmpr, pNew->numOfColumns * sizeof(SColCmpr));
22,273✔
478
  }
479

480
  if (pNew->pExtSchemas) {
28,451✔
481
    taosMemoryFreeClear(pOld->pExtSchemas);
19,050!
482
    pOld->pExtSchemas = taosMemoryCalloc(pNew->numOfColumns, sizeof(SExtSchema));
19,050!
483
    if (pOld->pExtSchemas == NULL){
19,050!
484
      goto END;
×
485
    }
486
    memcpy(pOld->pExtSchemas, pNew->pExtSchemas, pNew->numOfColumns * sizeof(SExtSchema));
19,050✔
487
  }
488

489
END:
9,401✔
490
  taosWUnLockLatch(&pOld->lock);
28,451✔
491
  return terrno;
28,451✔
492
}
493

494
SStbObj *mndAcquireStb(SMnode *pMnode, char *stbName) {
2,010,604✔
495
  SSdb    *pSdb = pMnode->pSdb;
2,010,604✔
496
  SStbObj *pStb = sdbAcquire(pSdb, SDB_STB, stbName);
2,010,604✔
497
  if (pStb == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
2,010,786!
498
    terrno = TSDB_CODE_MND_STB_NOT_EXIST;
10,368✔
499
  }
500
  return pStb;
2,010,710✔
501
}
502

503
void mndReleaseStb(SMnode *pMnode, SStbObj *pStb) {
2,007,904✔
504
  SSdb *pSdb = pMnode->pSdb;
2,007,904✔
505
  sdbRelease(pSdb, pStb);
2,007,904✔
506
}
2,007,909✔
507

508
SDbObj *mndAcquireDbByStb(SMnode *pMnode, const char *stbName) {
18,772✔
509
  SName name = {0};
18,772✔
510
  if ((terrno = tNameFromString(&name, stbName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0) return NULL;
18,772!
511

512
  char db[TSDB_TABLE_FNAME_LEN] = {0};
18,772✔
513
  if ((terrno = tNameGetFullDbName(&name, db)) != 0) return NULL;
18,772!
514

515
  return mndAcquireDb(pMnode, db);
18,772✔
516
}
517

518
static FORCE_INLINE int32_t schemaExColIdCompare(const void *colId, const void *pSchema) {
519
  if (*(col_id_t *)colId < ((SSchema *)pSchema)->colId) {
520
    return -1;
521
  } else if (*(col_id_t *)colId > ((SSchema *)pSchema)->colId) {
522
    return 1;
523
  }
524
  return 0;
525
}
526

527
void *mndBuildVCreateStbReq(SMnode *pMnode, SVgObj *pVgroup, SStbObj *pStb, int32_t *pContLen, void *alterOriData,
29,803✔
528
                            int32_t alterOriDataLen) {
529
  SEncoder       encoder = {0};
29,803✔
530
  int32_t        contLen;
531
  SName          name = {0};
29,803✔
532
  SVCreateStbReq req = {0};
29,803✔
533

534
  if ((terrno = tNameFromString(&name, pStb->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0) {
29,803!
535
    goto _err;
×
536
  }
537
  char dbFName[TSDB_DB_FNAME_LEN] = {0};
29,803✔
538
  if ((terrno = tNameGetFullDbName(&name, dbFName)) != 0) {
29,803!
539
    goto _err;
×
540
  };
541

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

557
  req.colCmpred = 1;
29,803✔
558
  SColCmprWrapper *pCmpr = &req.colCmpr;
29,803✔
559
  req.keep = pStb->keep;
29,803✔
560
  pCmpr->version = pStb->colVer;
29,803✔
561
  pCmpr->nCols = pStb->numOfColumns;
29,803✔
562

563
  req.colCmpr.pColCmpr = taosMemoryCalloc(pCmpr->nCols, sizeof(SColCmpr));
29,803!
564
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
2,717,279✔
565
    SColCmpr *p = &pCmpr->pColCmpr[i];
2,687,476✔
566
    p->alg = pStb->pCmpr[i].alg;
2,687,476✔
567
    p->id = pStb->pCmpr[i].id;
2,687,476✔
568
  }
569

570
  req.pExtSchemas = pStb->pExtSchemas; // only reference to it.
29,803✔
571
  // get length
572
  int32_t ret = 0;
29,803✔
573
  tEncodeSize(tEncodeSVCreateStbReq, &req, contLen, ret);
29,803!
574
  if (ret < 0) {
29,803!
575
    goto _err;
×
576
  }
577

578
  contLen += sizeof(SMsgHead);
29,803✔
579

580
  SMsgHead *pHead = taosMemoryCalloc(1, contLen);
29,803!
581
  if (pHead == NULL) {
29,803!
582
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
583
    goto _err;
×
584
  }
585

586
  pHead->contLen = htonl(contLen);
29,803✔
587
  pHead->vgId = htonl(pVgroup->vgId);
29,803✔
588

589
  void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
29,803✔
590
  tEncoderInit(&encoder, pBuf, contLen - sizeof(SMsgHead));
29,803✔
591
  if (tEncodeSVCreateStbReq(&encoder, &req) < 0) {
29,803!
592
    taosMemoryFreeClear(pHead);
×
593
    tEncoderClear(&encoder);
×
594
    goto _err;
×
595
  }
596
  tEncoderClear(&encoder);
29,803✔
597

598
  *pContLen = contLen;
29,803✔
599
  taosMemoryFreeClear(req.rsmaParam.name);
29,803!
600
  taosMemoryFreeClear(req.rsmaParam.funcColIds);
29,803!
601
  taosMemoryFreeClear(req.rsmaParam.funcIds);
29,803!
602
  taosMemoryFreeClear(req.colCmpr.pColCmpr);
29,803!
603
  return pHead;
29,803✔
604
_err:
×
605
  taosMemoryFreeClear(req.rsmaParam.name);
×
606
  taosMemoryFreeClear(req.rsmaParam.funcColIds);
×
607
  taosMemoryFreeClear(req.rsmaParam.funcIds);
×
608
  taosMemoryFreeClear(req.colCmpr.pColCmpr);
×
609
  return NULL;
×
610
}
611

612
static void *mndBuildVDropStbReq(SMnode *pMnode, SVgObj *pVgroup, SStbObj *pStb, int32_t *pContLen) {
18,368✔
613
  SName        name = {0};
18,368✔
614
  SVDropStbReq req = {0};
18,368✔
615
  int32_t      contLen = 0;
18,368✔
616
  int32_t      ret = 0;
18,368✔
617
  SMsgHead    *pHead = NULL;
18,368✔
618
  SEncoder     encoder = {0};
18,368✔
619

620
  if ((terrno = tNameFromString(&name, pStb->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0) {
18,368!
621
    return NULL;
×
622
  }
623

624
  req.name = (char *)tNameGetTableName(&name);
18,368✔
625
  req.suid = pStb->uid;
18,368✔
626

627
  tEncodeSize(tEncodeSVDropStbReq, &req, contLen, ret);
18,368!
628
  if (ret < 0) return NULL;
18,368!
629

630
  contLen += sizeof(SMsgHead);
18,368✔
631
  pHead = taosMemoryMalloc(contLen);
18,368!
632
  if (pHead == NULL) {
18,368!
633
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
634
    return NULL;
×
635
  }
636

637
  pHead->contLen = htonl(contLen);
18,368✔
638
  pHead->vgId = htonl(pVgroup->vgId);
18,368✔
639

640
  void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
18,368✔
641

642
  tEncoderInit(&encoder, pBuf, contLen - sizeof(SMsgHead));
18,368✔
643
  int32_t code = tEncodeSVDropStbReq(&encoder, &req);
18,368✔
644
  tEncoderClear(&encoder);
18,368✔
645
  if (code != 0) {
18,368!
646
    terrno = code;
×
647
    return NULL;
×
648
  }
649

650
  *pContLen = contLen;
18,368✔
651
  return pHead;
18,368✔
652
}
653

654
int32_t mndCheckCreateStbReq(SMCreateStbReq *pCreate) {
6,819✔
655
  int32_t code = 0;
6,819✔
656
  if (pCreate->igExists < 0 || pCreate->igExists > 1) {
6,819!
657
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
658
    TAOS_RETURN(code);
×
659
  }
660

661
  if (pCreate->virtualStb != 0 && pCreate->virtualStb != 1) {
6,819!
662
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
663
    TAOS_RETURN(code);
×
664
  }
665

666
  if (pCreate->numOfColumns < TSDB_MIN_COLUMNS || pCreate->numOfTags + pCreate->numOfColumns > TSDB_MAX_COLUMNS) {
6,819!
667
    code = TSDB_CODE_PAR_INVALID_COLUMNS_NUM;
×
668
    TAOS_RETURN(code);
×
669
  }
670

671
  if (pCreate->numOfTags <= 0 || pCreate->numOfTags > TSDB_MAX_TAGS) {
6,819!
672
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
673
    TAOS_RETURN(code);
×
674
  }
675

676
  SField *pField = taosArrayGet(pCreate->pColumns, 0);
6,819✔
677
  if (pField->type != TSDB_DATA_TYPE_TIMESTAMP) {
6,819!
678
    code = TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
679
    TAOS_RETURN(code);
×
680
  }
681

682
  for (int32_t i = 0; i < pCreate->numOfColumns; ++i) {
132,052✔
683
    SFieldWithOptions *pField1 = taosArrayGet(pCreate->pColumns, i);
125,233✔
684
    if (pField1->type >= TSDB_DATA_TYPE_MAX) {
125,233!
685
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
686
      TAOS_RETURN(code);
×
687
    }
688
    if (pField1->bytes <= 0) {
125,233!
689
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
690
      TAOS_RETURN(code);
×
691
    }
692
    if (pField1->name[0] == 0) {
125,233!
693
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
694
      TAOS_RETURN(code);
×
695
    }
696
  }
697

698
  for (int32_t i = 0; i < pCreate->numOfTags; ++i) {
44,179✔
699
    SField *pField1 = taosArrayGet(pCreate->pTags, i);
37,360✔
700
    if (pField1->type >= TSDB_DATA_TYPE_MAX) {
37,360!
701
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
702
      TAOS_RETURN(code);
×
703
    }
704
    if (pField1->bytes <= 0) {
37,360!
705
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
706
      TAOS_RETURN(code);
×
707
    }
708
    if (pField1->name[0] == 0) {
37,360!
709
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
710
      TAOS_RETURN(code);
×
711
    }
712
  }
713

714
  TAOS_RETURN(code);
6,819✔
715
}
716

717
static int32_t mndSetCreateStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
×
718
  int32_t  code = 0;
×
719
  SSdbRaw *pRedoRaw = mndStbActionEncode(pStb);
×
720
  if (pRedoRaw == NULL) {
×
721
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
722
    if (terrno != 0) code = terrno;
×
723
    TAOS_RETURN(code);
×
724
  }
725
  if ((code = mndTransAppendPrepareLog(pTrans, pRedoRaw)) != 0) {
×
726
    sdbFreeRaw(pRedoRaw);
×
727
    TAOS_RETURN(code);
×
728
  }
729
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_CREATING));
×
730

731
  TAOS_RETURN(code);
×
732
}
733

734
int32_t mndSetCreateStbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
6,507✔
735
  int32_t  code = 0;
6,507✔
736
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
6,507✔
737
  if (pCommitRaw == NULL) {
6,507!
738
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
739
    if (terrno != 0) code = terrno;
×
740
    TAOS_RETURN(code);
×
741
  }
742
  if ((code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
6,507!
743
    sdbFreeRaw(pCommitRaw);
×
744
    TAOS_RETURN(code);
×
745
  }
746
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
6,507!
747

748
  TAOS_RETURN(code);
6,507✔
749
}
750

751
static int32_t mndSetCreateStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
6,495✔
752
  int32_t code = 0;
6,495✔
753
  SSdb   *pSdb = pMnode->pSdb;
6,495✔
754
  SVgObj *pVgroup = NULL;
6,495✔
755
  void   *pIter = NULL;
6,495✔
756
  int32_t contLen;
757

758
  while (1) {
61,522✔
759
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
68,017✔
760
    if (pIter == NULL) break;
68,017✔
761
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
61,522✔
762
      sdbRelease(pSdb, pVgroup);
46,061✔
763
      continue;
46,061✔
764
    }
765

766
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, NULL, 0);
15,461✔
767
    if (pReq == NULL) {
15,461!
768
      sdbCancelFetch(pSdb, pIter);
×
769
      sdbRelease(pSdb, pVgroup);
×
770
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
771
      if (terrno != 0) code = terrno;
×
772
      TAOS_RETURN(code);
×
773
    }
774

775
    STransAction action = {0};
15,461✔
776
    action.mTraceId = pTrans->mTraceId;
15,461✔
777
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
15,461✔
778
    action.pCont = pReq;
15,461✔
779
    action.contLen = contLen;
15,461✔
780
    action.msgType = TDMT_VND_CREATE_STB;
15,461✔
781
    action.acceptableCode = TSDB_CODE_TDB_STB_ALREADY_EXIST;
15,461✔
782
    action.retryCode = TSDB_CODE_TDB_STB_NOT_EXIST;
15,461✔
783
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
15,461!
784
      taosMemoryFree(pReq);
×
785
      sdbCancelFetch(pSdb, pIter);
×
786
      sdbRelease(pSdb, pVgroup);
×
787
      TAOS_RETURN(code);
×
788
    }
789
    sdbRelease(pSdb, pVgroup);
15,461✔
790
  }
791

792
  TAOS_RETURN(code);
6,495✔
793
}
794

795
int32_t mndSetForceDropCreateStbRedoActions(SMnode *pMnode, STrans *pTrans, SVgObj *pVgroup, SStbObj *pStb) {
×
796
  int32_t code = 0;
×
797
  SSdb   *pSdb = pMnode->pSdb;
×
798
  int32_t contLen;
799

800
  void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, NULL, 0);
×
801
  if (pReq == NULL) {
×
802
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
803
    if (terrno != 0) code = terrno;
×
804
    TAOS_RETURN(code);
×
805
  }
806

807
  STransAction action = {0};
×
808
  action.mTraceId = pTrans->mTraceId;
×
809
  action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
×
810
  action.pCont = pReq;
×
811
  action.contLen = contLen;
×
812
  action.msgType = TDMT_VND_CREATE_STB;
×
813
  action.acceptableCode = TSDB_CODE_TDB_STB_ALREADY_EXIST;
×
814
  action.retryCode = TSDB_CODE_TDB_STB_NOT_EXIST;
×
815
  action.groupId = pVgroup->vgId;
×
816
  if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
×
817
    taosMemoryFree(pReq);
×
818
    TAOS_RETURN(code);
×
819
  }
820

821
  TAOS_RETURN(code);
×
822
}
823

824
static int32_t mndSetCreateStbUndoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
6,495✔
825
  int32_t code = 0;
6,495✔
826
  SSdb   *pSdb = pMnode->pSdb;
6,495✔
827
  SVgObj *pVgroup = NULL;
6,495✔
828
  void   *pIter = NULL;
6,495✔
829

830
  while (1) {
61,522✔
831
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
68,017✔
832
    if (pIter == NULL) break;
68,017✔
833
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
61,522✔
834
      sdbRelease(pSdb, pVgroup);
46,061✔
835
      continue;
46,061✔
836
    }
837

838
    int32_t contLen = 0;
15,461✔
839
    void   *pReq = mndBuildVDropStbReq(pMnode, pVgroup, pStb, &contLen);
15,461✔
840
    if (pReq == NULL) {
15,461!
841
      sdbCancelFetch(pSdb, pIter);
×
842
      sdbRelease(pSdb, pVgroup);
×
843
      code = TSDB_CODE_OUT_OF_MEMORY;
×
844
      TAOS_RETURN(code);
×
845
    }
846

847
    STransAction action = {0};
15,461✔
848
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
15,461✔
849
    action.pCont = pReq;
15,461✔
850
    action.contLen = contLen;
15,461✔
851
    action.msgType = TDMT_VND_DROP_STB;
15,461✔
852
    action.acceptableCode = TSDB_CODE_TDB_STB_NOT_EXIST;
15,461✔
853
    if ((code = mndTransAppendUndoAction(pTrans, &action)) != 0) {
15,461!
854
      taosMemoryFree(pReq);
×
855
      sdbCancelFetch(pSdb, pIter);
×
856
      sdbRelease(pSdb, pVgroup);
×
857
      TAOS_RETURN(code);
×
858
    }
859
    sdbRelease(pSdb, pVgroup);
15,461✔
860
  }
861

862
  TAOS_RETURN(code);
6,495✔
863
}
864

865
static SSchema *mndFindStbColumns(const SStbObj *pStb, const char *colName) {
×
866
  for (int32_t col = 0; col < pStb->numOfColumns; ++col) {
×
867
    SSchema *pSchema = &pStb->pColumns[col];
×
868
    if (taosStrncasecmp(pSchema->name, colName, TSDB_COL_NAME_LEN) == 0) {
×
869
      return pSchema;
×
870
    }
871
  }
872
  return NULL;
×
873
}
874

875
int32_t mndBuildStbFromReq(SMnode *pMnode, SStbObj *pDst, SMCreateStbReq *pCreate, SDbObj *pDb) {
6,607✔
876
  int32_t code = 0;
6,607✔
877
  bool    hasTypeMods = false;
6,607✔
878
  memcpy(pDst->name, pCreate->name, TSDB_TABLE_FNAME_LEN);
6,607✔
879
  memcpy(pDst->db, pDb->name, TSDB_DB_FNAME_LEN);
6,607✔
880
  pDst->createdTime = taosGetTimestampMs();
6,607✔
881
  pDst->updateTime = pDst->createdTime;
6,607✔
882
  pDst->uid = (pCreate->source == TD_REQ_FROM_TAOX_OLD || pCreate->source == TD_REQ_FROM_TAOX || pCreate->source == TD_REQ_FROM_SML)
6,607!
883
                  ? pCreate->suid
884
                  : mndGenerateUid(pCreate->name, TSDB_TABLE_FNAME_LEN);
13,214!
885
  pDst->dbUid = pDb->uid;
6,607✔
886
  pDst->tagVer = 1;
6,607✔
887
  pDst->colVer = 1;
6,607✔
888
  pDst->smaVer = 1;
6,607✔
889
  pDst->nextColId = 1;
6,607✔
890
  pDst->maxdelay[0] = pCreate->delay1;
6,607✔
891
  pDst->maxdelay[1] = pCreate->delay2;
6,607✔
892
  pDst->watermark[0] = pCreate->watermark1;
6,607✔
893
  pDst->watermark[1] = pCreate->watermark2;
6,607✔
894
  pDst->ttl = pCreate->ttl;
6,607✔
895
  pDst->numOfColumns = pCreate->numOfColumns;
6,607✔
896
  pDst->numOfTags = pCreate->numOfTags;
6,607✔
897
  pDst->numOfFuncs = pCreate->numOfFuncs;
6,607✔
898
  pDst->commentLen = pCreate->commentLen;
6,607✔
899
  pDst->pFuncs = pCreate->pFuncs;
6,607✔
900
  pDst->source = pCreate->source;
6,607✔
901
  pDst->keep = pCreate->keep;
6,607✔
902
  pDst->virtualStb = pCreate->virtualStb;
6,607✔
903
  pCreate->pFuncs = NULL;
6,607✔
904

905
  if (pDst->commentLen > 0) {
6,607✔
906
    pDst->comment = taosMemoryCalloc(pDst->commentLen + 1, 1);
16!
907
    if (pDst->comment == NULL) {
16!
908
      code = terrno;
×
909
      TAOS_RETURN(code);
×
910
    }
911
    memcpy(pDst->comment, pCreate->pComment, pDst->commentLen + 1);
16✔
912
  }
913

914
  pDst->ast1Len = pCreate->ast1Len;
6,607✔
915
  if (pDst->ast1Len > 0) {
6,607!
916
    pDst->pAst1 = taosMemoryCalloc(pDst->ast1Len, 1);
×
917
    if (pDst->pAst1 == NULL) {
×
918
      code = terrno;
×
919
      TAOS_RETURN(code);
×
920
    }
921
    memcpy(pDst->pAst1, pCreate->pAst1, pDst->ast1Len);
×
922
  }
923

924
  pDst->ast2Len = pCreate->ast2Len;
6,607✔
925
  if (pDst->ast2Len > 0) {
6,607!
926
    pDst->pAst2 = taosMemoryCalloc(pDst->ast2Len, 1);
×
927
    if (pDst->pAst2 == NULL) {
×
928
      code = terrno;
×
929
      TAOS_RETURN(code);
×
930
    }
931
    memcpy(pDst->pAst2, pCreate->pAst2, pDst->ast2Len);
×
932
  }
933

934
  pDst->pColumns = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SSchema));
6,607!
935
  pDst->pTags = taosMemoryCalloc(1, pDst->numOfTags * sizeof(SSchema));
6,607!
936
  if (pDst->pColumns == NULL || pDst->pTags == NULL) {
6,607!
937
    code = terrno;
×
938
    TAOS_RETURN(code);
×
939
  }
940

941
  if (pDst->nextColId < 0 || pDst->nextColId >= 0x7fff - pDst->numOfColumns - pDst->numOfTags) {
6,607!
942
    code = TSDB_CODE_OUT_OF_RANGE;
×
943
    TAOS_RETURN(code);
×
944
  }
945

946
  for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
130,551✔
947
    SFieldWithOptions *pField = taosArrayGet(pCreate->pColumns, i);
123,944✔
948
    SSchema           *pSchema = &pDst->pColumns[i];
123,944✔
949
    pSchema->type = pField->type;
123,944✔
950
    pSchema->bytes = pField->bytes;
123,944✔
951
    pSchema->flags = pField->flags;
123,944✔
952
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
123,944✔
953
    pSchema->colId = pDst->nextColId;
123,944✔
954
    pDst->nextColId++;
123,944✔
955
    hasTypeMods = hasTypeMods || HAS_TYPE_MOD(pSchema);
123,944✔
956
  }
957

958
  for (int32_t i = 0; i < pDst->numOfTags; ++i) {
42,583✔
959
    SField  *pField = taosArrayGet(pCreate->pTags, i);
35,976✔
960
    SSchema *pSchema = &pDst->pTags[i];
35,976✔
961
    pSchema->type = pField->type;
35,976✔
962
    pSchema->bytes = pField->bytes;
35,976✔
963
    if (i == 0) {
35,976✔
964
      SSCHMEA_SET_IDX_ON(pSchema);
6,607✔
965
    }
966
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
35,976✔
967
    pSchema->colId = pDst->nextColId;
35,976✔
968
    pDst->nextColId++;
35,976✔
969
  }
970
  // set col compress
971
  pDst->pCmpr = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SCmprObj));
6,607!
972
  for (int32_t i = 0; i < pDst->numOfColumns; i++) {
130,551✔
973
    SFieldWithOptions *pField = taosArrayGet(pCreate->pColumns, i);
123,944✔
974
    SSchema           *pSchema = &pDst->pColumns[i];
123,944✔
975

976
    SColCmpr *pColCmpr = &pDst->pCmpr[i];
123,944✔
977
    pColCmpr->id = pSchema->colId;
123,944✔
978
    pColCmpr->alg = pField->compress;
123,944✔
979
  }
980

981
  if (hasTypeMods) {
6,607✔
982
    pDst->pExtSchemas = taosMemoryCalloc(pDst->numOfColumns, sizeof(SExtSchema));
62!
983
    if (!pDst->pExtSchemas) {
62!
984
      code = terrno;
×
985
      TAOS_RETURN(code);
×
986
    }
987
    for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
1,059✔
988
      SFieldWithOptions * pField = taosArrayGet(pCreate->pColumns, i);
997✔
989
      pDst->pExtSchemas[i].typeMod = pField->typeMod;
997✔
990
    }
991
  }
992
  TAOS_RETURN(code);
6,607✔
993
}
994
int32_t mndGenIdxNameForFirstTag(char *fullname, char *dbname, char *stbname, char *tagname) {
6,423✔
995
  SName name = {0};
6,423✔
996
  if ((terrno = tNameFromString(&name, stbname, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0) {
6,423!
997
    return -1;
×
998
  }
999
  return snprintf(fullname, TSDB_INDEX_FNAME_LEN, "%s.%s_%s", dbname, tagname, tNameGetTableName(&name));
6,423✔
1000
}
1001

1002
static int32_t mndCreateStb(SMnode *pMnode, SRpcMsg *pReq, SMCreateStbReq *pCreate, SDbObj *pDb) {
6,411✔
1003
  SStbObj stbObj = {0};
6,411✔
1004
  int32_t code = -1;
6,411✔
1005

1006
  char fullIdxName[TSDB_INDEX_FNAME_LEN * 2] = {0};
6,411✔
1007

1008
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_DB_INSIDE, pReq, "create-stb");
6,411✔
1009
  if (pTrans == NULL) {
6,411!
1010
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1011
    if (terrno != 0) code = terrno;
×
1012
    goto _OVER;
×
1013
  }
1014

1015
  mInfo("trans:%d, used to create stb:%s", pTrans->id, pCreate->name);
6,411!
1016
  TAOS_CHECK_GOTO(mndBuildStbFromReq(pMnode, &stbObj, pCreate, pDb), NULL, _OVER);
6,411!
1017

1018
  SSchema *pSchema = &(stbObj.pTags[0]);
6,411✔
1019
  if (mndGenIdxNameForFirstTag(fullIdxName, pDb->name, stbObj.name, pSchema->name) < 0) {
6,411!
1020
    goto _OVER;
×
1021
  }
1022
  SSIdx idx = {0};
6,411✔
1023
  if (mndAcquireGlobalIdx(pMnode, fullIdxName, SDB_IDX, &idx) == 0 && idx.pIdx != NULL) {
6,411!
1024
    code = TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST;
×
1025
    mndReleaseIdx(pMnode, idx.pIdx);
×
1026
    goto _OVER;
×
1027
  }
1028

1029
  SIdxObj idxObj = {0};
6,411✔
1030
  memcpy(idxObj.name, fullIdxName, TSDB_INDEX_FNAME_LEN);
6,411✔
1031
  memcpy(idxObj.stb, stbObj.name, TSDB_TABLE_FNAME_LEN);
6,411✔
1032
  memcpy(idxObj.db, stbObj.db, TSDB_DB_FNAME_LEN);
6,411✔
1033
  memcpy(idxObj.colName, pSchema->name, TSDB_COL_NAME_LEN);
6,411✔
1034
  idxObj.createdTime = taosGetTimestampMs();
6,411✔
1035
  idxObj.uid = mndGenerateUid(fullIdxName, strlen(fullIdxName));
6,411✔
1036
  idxObj.stbUid = stbObj.uid;
6,411✔
1037
  idxObj.dbUid = stbObj.dbUid;
6,411✔
1038

1039
  TAOS_CHECK_GOTO(mndSetCreateIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
6,411!
1040

1041
  TAOS_CHECK_GOTO(mndAddStbToTrans(pMnode, pTrans, pDb, &stbObj), NULL, _OVER);
6,411✔
1042
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
6,299!
1043
  code = 0;
6,299✔
1044

1045
_OVER:
6,411✔
1046
  mndTransDrop(pTrans);
6,411✔
1047
  if (mndStbActionDelete(pMnode->pSdb, &stbObj) != 0) mError("failed to mndStbActionDelete");
6,411!
1048
  TAOS_RETURN(code);
6,411✔
1049
}
1050

1051
int32_t mndAddStbToTrans(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
6,607✔
1052
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
6,607✔
1053
  TAOS_CHECK_RETURN(mndTransCheckConflict(pMnode, pTrans));
6,607✔
1054
  TAOS_CHECK_RETURN(mndSetCreateStbCommitLogs(pMnode, pTrans, pDb, pStb));
6,495!
1055
  TAOS_CHECK_RETURN(mndSetCreateStbRedoActions(pMnode, pTrans, pDb, pStb));
6,495!
1056
  TAOS_CHECK_RETURN(mndSetCreateStbUndoActions(pMnode, pTrans, pDb, pStb));
6,495!
1057
  return 0;
6,495✔
1058
}
1059

1060
static int32_t mndProcessTtlTimer(SRpcMsg *pReq) {
5,230✔
1061
  SMnode           *pMnode = pReq->info.node;
5,230✔
1062
  SSdb             *pSdb = pMnode->pSdb;
5,230✔
1063
  SVgObj           *pVgroup = NULL;
5,230✔
1064
  void             *pIter = NULL;
5,230✔
1065
  SVDropTtlTableReq ttlReq = {
5,230✔
1066
      .timestampSec = taosGetTimestampSec(), .ttlDropMaxCount = tsTtlBatchDropNum, .nUids = 0, .pTbUids = NULL};
5,230✔
1067
  int32_t reqLen = tSerializeSVDropTtlTableReq(NULL, 0, &ttlReq);
5,230✔
1068
  int32_t contLen = reqLen + sizeof(SMsgHead);
5,230✔
1069

1070
  mDebug("start to process ttl timer");
5,230✔
1071

1072
  while (1) {
58,317✔
1073
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
63,547✔
1074
    if (pIter == NULL) break;
63,547✔
1075

1076
    if (pVgroup->mountVgId) {
58,317✔
1077
      sdbRelease(pSdb, pVgroup);
16✔
1078
      continue;
16✔
1079
    }
1080

1081
    int32_t   code = 0;
58,301✔
1082
    SMsgHead *pHead = rpcMallocCont(contLen);
58,301✔
1083
    if (pHead == NULL) {
58,301!
1084
      sdbRelease(pSdb, pVgroup);
×
1085
      continue;
×
1086
    }
1087
    pHead->contLen = htonl(contLen);
58,301✔
1088
    pHead->vgId = htonl(pVgroup->vgId);
58,301✔
1089
    if ((code = tSerializeSVDropTtlTableReq((char *)pHead + sizeof(SMsgHead), reqLen, &ttlReq)) < 0) {
58,301!
1090
      mError("vgId:%d, failed to serialize drop ttl table request since %s", pVgroup->vgId, tstrerror(code));
×
1091
      sdbRelease(pSdb, pVgroup);
×
1092
      continue;
×
1093
    }
1094

1095
    SRpcMsg rpcMsg = {
58,301✔
1096
        .msgType = TDMT_VND_FETCH_TTL_EXPIRED_TBS, .pCont = pHead, .contLen = contLen, .info = pReq->info};
1097
    SEpSet epSet = mndGetVgroupEpset(pMnode, pVgroup);
58,301✔
1098
    code = tmsgSendReq(&epSet, &rpcMsg);
58,301✔
1099
    if (code != 0) {
58,301✔
1100
      mError("vgId:%d, failed to send drop ttl table request to vnode since 0x%x", pVgroup->vgId, code);
14!
1101
    } else {
1102
      mDebug("vgId:%d, send drop ttl table request to vnode, time:%" PRId32, pVgroup->vgId, ttlReq.timestampSec);
58,287✔
1103
    }
1104
    sdbRelease(pSdb, pVgroup);
58,301✔
1105
  }
1106

1107
  return 0;
5,230✔
1108
}
1109

1110
#if 0
1111
static int32_t mndProcessTrimDbTimer(SRpcMsg *pReq) {
1112
  SMnode     *pMnode = pReq->info.node;
1113
  SSdb       *pSdb = pMnode->pSdb;
1114
  SVgObj     *pVgroup = NULL;
1115
  void       *pIter = NULL;
1116
  SVTrimDbReq trimReq = {0};
1117
  trimReq.compactStartTime = taosGetTimestampMs();
1118
  trimReq.tw.skey = INT64_MIN;
1119
  trimReq.tw.ekey = trimReq.compactStartTime;
1120
  trimReq.compactId = 0;  // TODO: use the real value
1121
  trimReq.metaOnly = 0;
1122
  trimReq.triggerType = TSDB_TRIGGER_AUTO;
1123
  int32_t reqLen = tSerializeSVTrimDbReq(NULL, 0, &trimReq);
1124
  int32_t contLen = reqLen + sizeof(SMsgHead);
1125

1126
  while (1) {
1127
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
1128
    if (pIter == NULL) break;
1129
    if (pVgroup->mountVgId) {
1130
      sdbRelease(pSdb, pVgroup);
1131
      continue;
1132
    }
1133

1134
    int32_t code = 0;
1135

1136
    SMsgHead *pHead = rpcMallocCont(contLen);
1137
    if (pHead == NULL) {
1138
      sdbCancelFetch(pSdb, pVgroup);
1139
      sdbRelease(pSdb, pVgroup);
1140
      continue;
1141
    }
1142
    pHead->contLen = htonl(contLen);
1143
    pHead->vgId = htonl(pVgroup->vgId);
1144
    trimReq.dbUid = pVgroup->dbUid;
1145
    (void)snprintf(trimReq.db, sizeof(trimReq.db), "%s", pVgroup->dbName);
1146
    if ((code = tSerializeSVTrimDbReq((char *)pHead + sizeof(SMsgHead), reqLen, &trimReq)) < 0) {
1147
      mError("vgId:%d, failed to serialize trim db request since %s", pVgroup->vgId, tstrerror(code));
1148
    }
1149

1150
    SRpcMsg rpcMsg = {.msgType = TDMT_VND_TRIM, .pCont = pHead, .contLen = contLen};
1151
    SEpSet  epSet = mndGetVgroupEpset(pMnode, pVgroup);
1152
    code = tmsgSendReq(&epSet, &rpcMsg);
1153
    if (code != 0) {
1154
      mError("vgId:%d, timer failed to send vnode-trim request to vnode since 0x%x", pVgroup->vgId, code);
1155
    } else {
1156
      mInfo("vgId:%d, timer send vnode-trim request to vnode, time:%" PRIi64 " ms", pVgroup->vgId, trimReq.tw.ekey);
1157
    }
1158
    sdbRelease(pSdb, pVgroup);
1159
  }
1160

1161
  return 0;
1162
}
1163
#endif
1164

1165
static int32_t mndFindSuperTableTagIndex(const SStbObj *pStb, const char *tagName) {
7,506✔
1166
  for (int32_t tag = 0; tag < pStb->numOfTags; tag++) {
111,656✔
1167
    if (strcmp(pStb->pTags[tag].name, tagName) == 0) {
106,291✔
1168
      return tag;
2,141✔
1169
    }
1170
  }
1171

1172
  return -1;
5,365✔
1173
}
1174

1175
static int32_t mndFindSuperTableColumnIndex(const SStbObj *pStb, const char *colName) {
9,483✔
1176
  for (int32_t col = 0; col < pStb->numOfColumns; col++) {
1,098,766✔
1177
    if (strcmp(pStb->pColumns[col].name, colName) == 0) {
1,093,290✔
1178
      return col;
4,007✔
1179
    }
1180
  }
1181

1182
  return -1;
5,476✔
1183
}
1184

1185
static bool mndValidateSchema(SSchema *pSchemas, int32_t nSchema, SArray *pFields, int32_t maxLen) {
5,335✔
1186
  int32_t rowLen = 0;
5,335✔
1187
  for (int32_t i = 0; i < nSchema; ++i) {
629,753✔
1188
    rowLen += (pSchemas + i)->bytes;
624,418✔
1189
  }
1190

1191
  int32_t nField = taosArrayGetSize(pFields);
5,335✔
1192
  for (int32_t i = 0; i < nField; ++i) {
10,670✔
1193
    rowLen += ((SField *)TARRAY_GET_ELEM(pFields, i))->bytes;
5,335✔
1194
  }
1195

1196
  return rowLen <= maxLen;
5,335✔
1197
}
1198

1199
static int32_t mndBuildStbFromAlter(SStbObj *pStb, SStbObj *pDst, SMCreateStbReq *createReq) {
75✔
1200
  int32_t code = 0;
75✔
1201
  taosRLockLatch(&pStb->lock);
75✔
1202
  memcpy(pDst, pStb, sizeof(SStbObj));
75✔
1203
  taosRUnLockLatch(&pStb->lock);
75✔
1204

1205
  pDst->source = createReq->source;
75✔
1206
  pDst->updateTime = taosGetTimestampMs();
75✔
1207
  pDst->numOfColumns = createReq->numOfColumns;
75✔
1208
  pDst->numOfTags = createReq->numOfTags;
75✔
1209
  pDst->pColumns = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SSchema));
75!
1210
  pDst->pTags = taosMemoryCalloc(1, pDst->numOfTags * sizeof(SSchema));
75!
1211
  pDst->pCmpr = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SColCmpr));
75!
1212
  pDst->pExtSchemas = taosMemoryCalloc(pDst->numOfColumns, sizeof(SExtSchema));
75!
1213

1214
  if (pDst->pColumns == NULL || pDst->pTags == NULL || pDst->pCmpr == NULL || pDst->pExtSchemas == NULL) {
75!
1215
    code = terrno;
×
1216
    TAOS_RETURN(code);
×
1217
  }
1218

1219
  if (pDst->nextColId < 0 || pDst->nextColId >= 0x7fff - pDst->numOfColumns - pDst->numOfTags) {
75!
1220
    code = TSDB_CODE_OUT_OF_RANGE;
×
1221
    TAOS_RETURN(code);
×
1222
  }
1223

1224
  for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
479✔
1225
    SFieldWithOptions *pField = taosArrayGet(createReq->pColumns, i);
404✔
1226
    SSchema           *pSchema = &pDst->pColumns[i];
404✔
1227
    pSchema->type = pField->type;
404✔
1228
    pSchema->bytes = pField->bytes;
404✔
1229
    pSchema->flags = pField->flags;
404✔
1230
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
404✔
1231
    int32_t cIndex = mndFindSuperTableColumnIndex(pStb, pField->name);
404✔
1232
    if (cIndex >= 0) {
404✔
1233
      pSchema->colId = pStb->pColumns[cIndex].colId;
363✔
1234
    } else {
1235
      pSchema->colId = pDst->nextColId++;
41✔
1236
    }
1237
  }
1238

1239
  for (int32_t i = 0; i < pDst->numOfTags; ++i) {
558✔
1240
    SField  *pField = taosArrayGet(createReq->pTags, i);
483✔
1241
    SSchema *pSchema = &pDst->pTags[i];
483✔
1242
    pSchema->type = pField->type;
483✔
1243
    pSchema->bytes = pField->bytes;
483✔
1244
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
483✔
1245
    int32_t cIndex = mndFindSuperTableTagIndex(pStb, pField->name);
483✔
1246
    if (cIndex >= 0) {
483✔
1247
      pSchema->colId = pStb->pTags[cIndex].colId;
448✔
1248
    } else {
1249
      pSchema->colId = pDst->nextColId++;
35✔
1250
    }
1251
  }
1252
  for (int32_t i = 0; i < pDst->numOfColumns; i++) {
479✔
1253
    SColCmpr          *p = pDst->pCmpr + i;
404✔
1254
    SFieldWithOptions *pField = taosArrayGet(createReq->pColumns, i);
404✔
1255
    SSchema           *pSchema = &pDst->pColumns[i];
404✔
1256
    p->id = pSchema->colId;
404✔
1257
    if (pField->compress == 0) {
404!
1258
      p->alg = createDefaultColCmprByType(pSchema->type);
×
1259
    } else {
1260
      p->alg = pField->compress;
404✔
1261
    }
1262
    if (pField->flags & COL_HAS_TYPE_MOD) {
404✔
1263
      pDst->pExtSchemas[i].typeMod = pField->typeMod;
16✔
1264
    }
1265
  }
1266
  pDst->tagVer = createReq->tagVer;
75✔
1267
  pDst->colVer = createReq->colVer;
75✔
1268
  return TSDB_CODE_SUCCESS;
75✔
1269
}
1270

1271
static int32_t mndProcessCreateStbReq(SRpcMsg *pReq) {
6,623✔
1272
  SMnode        *pMnode = pReq->info.node;
6,623✔
1273
  int32_t        code = -1;
6,623✔
1274
  SStbObj       *pStb = NULL;
6,623✔
1275
  SDbObj        *pDb = NULL;
6,623✔
1276
  SMCreateStbReq createReq = {0};
6,623✔
1277
  bool           isAlter = false;
6,623✔
1278
  SHashObj      *pHash = NULL;
6,623✔
1279

1280
  if (tDeserializeSMCreateStbReq(pReq->pCont, pReq->contLen, &createReq) != 0) {
6,623!
1281
    code = TSDB_CODE_INVALID_MSG;
×
1282
    goto _OVER;
×
1283
  }
1284

1285
  mInfo("stb:%s, start to create", createReq.name);
6,623!
1286
  if (mndCheckCreateStbReq(&createReq) != 0) {
6,623!
1287
    code = TSDB_CODE_INVALID_MSG;
×
1288
    goto _OVER;
×
1289
  }
1290

1291
  pStb = mndAcquireStb(pMnode, createReq.name);
6,623✔
1292
  if (pStb != NULL) {
6,623✔
1293
    if (createReq.igExists) {
206✔
1294
      if (createReq.source == TD_REQ_FROM_APP) {
203✔
1295
        mInfo("stb:%s, already exist, ignore exist is set", createReq.name);
28!
1296
        code = 0;
28✔
1297
        goto _OVER;
28✔
1298
      } else if (pStb->uid != createReq.suid) {
175!
1299
        mInfo("stb:%s, alter table does not need to be done, because table is deleted", createReq.name);
×
1300
        code = 0;
×
1301
        goto _OVER;
×
1302
      } else if (createReq.tagVer > 0 || createReq.colVer > 0) {
250!
1303
        int32_t tagDelta = createReq.tagVer - pStb->tagVer;
175✔
1304
        int32_t colDelta = createReq.colVer - pStb->colVer;
175✔
1305
        mInfo("stb:%s, already exist while create, input tagVer:%d colVer:%d, exist tagVer:%d colVer:%d",
175!
1306
              createReq.name, createReq.tagVer, createReq.colVer, pStb->tagVer, pStb->colVer);
1307
        if (tagDelta <= 0 && colDelta <= 0) {
175✔
1308
          mInfo("stb:%s, schema version is not incremented and nothing needs to be done", createReq.name);
100!
1309
          code = 0;
100✔
1310
          goto _OVER;
100✔
1311
        } else if ((tagDelta == 1 && colDelta == 0) || (tagDelta == 0 && colDelta == 1) ||
75!
1312
                   (pStb->colVer == 1 && createReq.colVer > 1) || (pStb->tagVer == 1 && createReq.tagVer > 1)) {
×
1313
          isAlter = true;
75✔
1314
          mInfo("stb:%s, schema version is only increased by 1 number, do alter operation", createReq.name);
75!
1315
        } else {
1316
          mError("stb:%s, schema version increase more than 1 number, error is returned", createReq.name);
×
1317
          code = TSDB_CODE_MND_INVALID_SCHEMA_VER;
×
1318
          goto _OVER;
×
1319
        }
1320
      } else {
1321
        mError("stb:%s, already exist while create, input tagVer:%d colVer:%d is invalid, origin tagVer:%d colVer:%d",
×
1322
               createReq.name, createReq.tagVer, createReq.colVer, pStb->tagVer, pStb->colVer);
1323
        code = TSDB_CODE_MND_INVALID_SCHEMA_VER;
×
1324
        goto _OVER;
×
1325
      }
1326
    } else {
1327
      code = TSDB_CODE_MND_STB_ALREADY_EXIST;
3✔
1328
      goto _OVER;
3✔
1329
    }
1330
  } else if (terrno != TSDB_CODE_MND_STB_NOT_EXIST) {
6,417!
1331
    goto _OVER;
×
1332
  } else if ((createReq.source == TD_REQ_FROM_TAOX_OLD || createReq.source == TD_REQ_FROM_TAOX || createReq.source == TD_REQ_FROM_SML) &&
6,417!
1333
             (createReq.tagVer != 1 || createReq.colVer != 1)) {
47✔
1334
    mInfo("stb:%s, alter table does not need to be done, because table is deleted", createReq.name);
3!
1335
    code = 0;
3✔
1336
    goto _OVER;
3✔
1337
  }
1338

1339
  pHash = taosHashInit(createReq.numOfColumns + createReq.numOfTags, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY),
6,489✔
1340
                       false, HASH_NO_LOCK);
1341
  if (pHash == NULL) {
6,489!
1342
    code = TSDB_CODE_OUT_OF_MEMORY;
×
1343
    goto _OVER;
×
1344
  }
1345

1346
  for (int32_t i = 0; i < createReq.numOfColumns; ++i) {
130,028✔
1347
    SFieldWithOptions *pField = taosArrayGet(createReq.pColumns, i);
123,539✔
1348
    if ((code = taosHashPut(pHash, pField->name, strlen(pField->name), NULL, 0)) != 0) {
123,539!
1349
      if (code == TSDB_CODE_DUP_KEY) {
×
1350
        code = TSDB_CODE_TSC_DUP_COL_NAMES;
×
1351
      }
1352
      goto _OVER;
×
1353
    }
1354
  }
1355

1356
  for (int32_t i = 0; i < createReq.numOfTags; ++i) {
42,639✔
1357
    SField *pField = taosArrayGet(createReq.pTags, i);
36,153✔
1358
    if ((code = taosHashPut(pHash, pField->name, strlen(pField->name), NULL, 0)) != 0) {
36,153✔
1359
      if (code == TSDB_CODE_DUP_KEY) {
3!
1360
        code = TSDB_CODE_TSC_DUP_COL_NAMES;
3✔
1361
      }
1362
      goto _OVER;
3✔
1363
    }
1364
  }
1365

1366
  pDb = mndAcquireDbByStb(pMnode, createReq.name);
6,486✔
1367
  if (pDb == NULL) {
6,486!
1368
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
1369
    goto _OVER;
×
1370
  }
1371

1372
  if ((code = mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_WRITE_DB, pDb)) != 0) {
6,486!
1373
    goto _OVER;
×
1374
  }
1375
  if (pDb->cfg.isMount) {
6,486!
1376
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
×
1377
    goto _OVER;
×
1378
  }
1379

1380
  int32_t numOfStbs = -1;
6,486✔
1381
  if ((code = mndGetNumOfStbs(pMnode, pDb->name, &numOfStbs)) != 0) {
6,486!
1382
    goto _OVER;
×
1383
  }
1384

1385
  if (pDb->cfg.numOfStables == 1 && numOfStbs != 0) {
6,486!
1386
    code = TSDB_CODE_MND_SINGLE_STB_MODE_DB;
×
1387
    goto _OVER;
×
1388
  }
1389

1390
  if ((code = grantCheck(TSDB_GRANT_STABLE)) < 0) {
6,486!
1391
    goto _OVER;
×
1392
  }
1393

1394
  if (isAlter) {
6,486✔
1395
    bool    needRsp = false;
75✔
1396
    SStbObj pDst = {0};
75✔
1397
    if ((code = mndBuildStbFromAlter(pStb, &pDst, &createReq)) != 0) {
75!
1398
      taosMemoryFreeClear(pDst.pTags);
×
1399
      taosMemoryFreeClear(pDst.pColumns);
×
1400
      taosMemoryFreeClear(pDst.pCmpr);
×
1401
      taosMemoryFreeClear(pDst.pExtSchemas);
×
1402
      goto _OVER;
×
1403
    }
1404

1405
    code = mndAlterStbImp(pMnode, pReq, pDb, &pDst, needRsp, NULL, 0);
75✔
1406
    taosMemoryFreeClear(pDst.pTags);
75!
1407
    taosMemoryFreeClear(pDst.pColumns);
75!
1408
    taosMemoryFreeClear(pDst.pCmpr);
75!
1409
    taosMemoryFreeClear(pDst.pExtSchemas);
75!
1410
  } else {
1411
    code = mndCreateStb(pMnode, pReq, &createReq, pDb);
6,411✔
1412
  }
1413
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
6,486✔
1414

1415
  SName name = {0};
6,486✔
1416
  TAOS_CHECK_RETURN(tNameFromString(&name, createReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
6,486!
1417

1418
  if (createReq.sql == NULL && createReq.sqlLen == 0) {
7,936!
1419
    char detail[1000] = {0};
1,450✔
1420

1421
    (void)tsnprintf(detail, sizeof(detail), "dbname:%s, stable name:%s", name.dbname, name.tname);
1,450✔
1422

1423
    auditRecord(pReq, pMnode->clusterId, "createStb", name.dbname, name.tname, detail, strlen(detail));
1,450✔
1424
  } else {
1425
    auditRecord(pReq, pMnode->clusterId, "createStb", name.dbname, name.tname, createReq.sql, createReq.sqlLen);
5,036✔
1426
  }
1427
_OVER:
6,623✔
1428
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
6,623✔
1429
    mError("stb:%s, failed to create since %s", createReq.name, tstrerror(code));
118!
1430
  }
1431

1432
  mndReleaseStb(pMnode, pStb);
6,623✔
1433
  mndReleaseDb(pMnode, pDb);
6,623✔
1434
  tFreeSMCreateStbReq(&createReq);
6,623✔
1435

1436
  if (pHash != NULL) {
6,623✔
1437
    taosHashCleanup(pHash);
6,489✔
1438
  }
1439

1440
  TAOS_RETURN(code);
6,623✔
1441
}
1442

1443
static int32_t mndCheckAlterStbReq(SMAlterStbReq *pAlter) {
10,139✔
1444
  int32_t code = 0;
10,139✔
1445
  if (pAlter->commentLen >= 0) return 0;
10,139✔
1446
  if (pAlter->ttl != 0) return 0;
20!
1447
  if (pAlter->keep != -1) return 0;
20!
1448

1449
  if (pAlter->numOfFields < 1 || pAlter->numOfFields != (int32_t)taosArrayGetSize(pAlter->pFields)) {
×
1450
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
1451
    TAOS_RETURN(code);
×
1452
  }
1453

1454
  for (int32_t i = 0; i < pAlter->numOfFields; ++i) {
×
1455
    SField *pField = taosArrayGet(pAlter->pFields, i);
×
1456
    if (pField->name[0] == 0) {
×
1457
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
1458
      TAOS_RETURN(code);
×
1459
    }
1460
  }
1461

1462
  TAOS_RETURN(code);
×
1463
}
1464

1465
int32_t mndAllocStbSchemas(const SStbObj *pOld, SStbObj *pNew) {
11,102✔
1466
  pNew->pTags = taosMemoryCalloc(pNew->numOfTags, sizeof(SSchema));
11,102!
1467
  pNew->pColumns = taosMemoryCalloc(pNew->numOfColumns, sizeof(SSchema));
11,102!
1468
  pNew->pCmpr = taosMemoryCalloc(pNew->numOfColumns, sizeof(SColCmpr));
11,102!
1469
  if (pNew->pTags == NULL || pNew->pColumns == NULL || pNew->pCmpr == NULL) {
11,102!
1470
    TAOS_RETURN(terrno);
×
1471
  }
1472

1473
  memcpy(pNew->pColumns, pOld->pColumns, sizeof(SSchema) * pOld->numOfColumns);
11,102✔
1474
  memcpy(pNew->pTags, pOld->pTags, sizeof(SSchema) * pOld->numOfTags);
11,102✔
1475
  memcpy(pNew->pCmpr, pOld->pCmpr, sizeof(SColCmpr) * pOld->numOfColumns);
11,102✔
1476
  if (pOld->pExtSchemas) {
11,102✔
1477
    pNew->pExtSchemas = taosMemoryCalloc(pNew->numOfColumns, sizeof(SExtSchema));
7,838!
1478
    if (pNew->pExtSchemas == NULL) {
7,838!
1479
      TAOS_RETURN(terrno);
×
1480
    }
1481
    memcpy(pNew->pExtSchemas, pOld->pExtSchemas, sizeof(SExtSchema) * pOld->numOfColumns);
7,838✔
1482
  }
1483

1484
  TAOS_RETURN(0);
11,102✔
1485
}
1486

1487
static int32_t mndUpdateTableOptions(const SStbObj *pOld, SStbObj *pNew, char *pComment, int32_t commentLen,
37✔
1488
                                     int32_t ttl, int64_t keep) {
1489
  int32_t code = 0;
37✔
1490
  if (commentLen > 0) {
37✔
1491
    pNew->commentLen = commentLen;
10✔
1492
    pNew->comment = taosMemoryCalloc(1, commentLen + 1);
10!
1493
    if (pNew->comment == NULL) {
10!
1494
      terrno = TSDB_CODE_OUT_OF_MEMORY;
×
1495
      return -1;
×
1496
    }
1497
    memcpy(pNew->comment, pComment, commentLen + 1);
10✔
1498
  } else if (commentLen == 0) {
27✔
1499
    pNew->commentLen = 0;
7✔
1500
  } else {
1501
  }
1502

1503
  if (ttl >= 0) {
37!
1504
    pNew->ttl = ttl;
37✔
1505
  }
1506

1507
  if (keep > 0) {
37✔
1508
    pNew->keep = keep;
20✔
1509
  }
1510

1511
  if ((code = mndAllocStbSchemas(pOld, pNew)) != 0) {
37!
1512
    TAOS_RETURN(code);
×
1513
  }
1514
  TAOS_RETURN(code);
37✔
1515
}
1516

1517
static int32_t mndAddSuperTableTag(const SStbObj *pOld, SStbObj *pNew, SArray *pFields, int32_t ntags) {
659✔
1518
  int32_t code = 0;
659✔
1519
  if (pOld->numOfTags + ntags > TSDB_MAX_TAGS) {
659!
1520
    code = TSDB_CODE_MND_TOO_MANY_TAGS;
×
1521
    TAOS_RETURN(code);
×
1522
  }
1523

1524
  if (pOld->numOfColumns + ntags + pOld->numOfTags > TSDB_MAX_COLUMNS) {
659!
1525
    code = TSDB_CODE_MND_TOO_MANY_COLUMNS;
×
1526
    TAOS_RETURN(code);
×
1527
  }
1528

1529
  if (!mndValidateSchema(pOld->pTags, pOld->numOfTags, pFields, TSDB_MAX_TAGS_LEN)) {
659✔
1530
    code = TSDB_CODE_PAR_INVALID_TAGS_LENGTH;
40✔
1531
    TAOS_RETURN(code);
40✔
1532
  }
1533

1534
  pNew->numOfTags = pNew->numOfTags + ntags;
619✔
1535
  if ((code = mndAllocStbSchemas(pOld, pNew)) != 0) {
619!
1536
    TAOS_RETURN(code);
×
1537
  }
1538

1539
  if (pNew->nextColId < 0 || pNew->nextColId >= 0x7fff - ntags) {
619!
1540
    code = TSDB_CODE_OUT_OF_RANGE;
×
1541
    TAOS_RETURN(code);
×
1542
  }
1543

1544
  for (int32_t i = 0; i < ntags; i++) {
1,125✔
1545
    SField *pField = taosArrayGet(pFields, i);
619✔
1546
    if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
619✔
1547
      code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
6✔
1548
      TAOS_RETURN(code);
6✔
1549
    }
1550

1551
    if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
613✔
1552
      code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
107✔
1553
      TAOS_RETURN(code);
107✔
1554
    }
1555

1556
    SSchema *pSchema = &pNew->pTags[pOld->numOfTags + i];
506✔
1557
    pSchema->bytes = pField->bytes;
506✔
1558
    pSchema->type = pField->type;
506✔
1559
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
506✔
1560
    pSchema->colId = pNew->nextColId;
506✔
1561
    pNew->nextColId++;
506✔
1562

1563
    mInfo("stb:%s, start to add tag %s", pNew->name, pSchema->name);
506!
1564
  }
1565

1566
  pNew->tagVer++;
506✔
1567
  TAOS_RETURN(code);
506✔
1568
}
1569

1570
static int32_t mndCheckAlterColForTopic(SMnode *pMnode, const char *stbFullName, int64_t suid, col_id_t colId) {
4,454✔
1571
  int32_t code = 0;
4,454✔
1572
  SSdb   *pSdb = pMnode->pSdb;
4,454✔
1573
  void   *pIter = NULL;
4,454✔
1574
  while (1) {
1,017✔
1575
    SMqTopicObj *pTopic = NULL;
5,471✔
1576
    pIter = sdbFetch(pSdb, SDB_TOPIC, pIter, (void **)&pTopic);
5,471✔
1577
    if (pIter == NULL) break;
5,471✔
1578

1579
    mInfo("topic:%s, check tag and column modifiable, stb:%s suid:%" PRId64 " colId:%d, subType:%d sql:%s",
1,095!
1580
          pTopic->name, stbFullName, suid, colId, pTopic->subType, pTopic->sql);
1581
    if (pTopic->ast == NULL) {
1,095✔
1582
      sdbRelease(pSdb, pTopic);
103✔
1583
      continue;
103✔
1584
    }
1585

1586
    SNode *pAst = NULL;
992✔
1587
    if (nodesStringToNode(pTopic->ast, &pAst) != 0) {
992!
1588
      code = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TOPIC;
×
1589
      mError("topic:%s, create ast error", pTopic->name);
×
1590
      sdbRelease(pSdb, pTopic);
×
1591
      sdbCancelFetch(pSdb, pIter);
×
1592
      TAOS_RETURN(code);
78✔
1593
    }
1594

1595
    SNodeList *pNodeList = NULL;
992✔
1596
    if ((code = nodesCollectColumns((SSelectStmt *)pAst, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pNodeList)) !=
992!
1597
        0) {
1598
      sdbRelease(pSdb, pTopic);
×
1599
      sdbCancelFetch(pSdb, pIter);
×
1600
      TAOS_RETURN(code);
×
1601
    }
1602
    SNode *pNode = NULL;
992✔
1603
    FOREACH(pNode, pNodeList) {
1,633✔
1604
      SColumnNode *pCol = (SColumnNode *)pNode;
1,556✔
1605
      mInfo("topic:%s, check colId:%d tableId:%" PRId64 " ctbStbUid:%" PRId64, pTopic->name, pCol->colId, pCol->tableId,
1,556!
1606
            pTopic->ctbStbUid);
1607

1608
      if (pCol->tableId != suid && pTopic->ctbStbUid != suid) {
1,556✔
1609
        mInfo("topic:%s, check colId:%d passed", pTopic->name, pCol->colId);
837!
1610
        goto NEXT;
837✔
1611
      }
1612
      if (pCol->colId > 0 && pCol->colId == colId) {
719!
1613
        code = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TOPIC;
78✔
1614
        mError("topic:%s, check colId:%d conflicted", pTopic->name, pCol->colId);
78!
1615
        nodesDestroyNode(pAst);
78✔
1616
        nodesDestroyList(pNodeList);
78✔
1617
        sdbCancelFetch(pSdb, pIter);
78✔
1618
        sdbRelease(pSdb, pTopic);
78✔
1619
        TAOS_RETURN(code);
78✔
1620
      }
1621
      mInfo("topic:%s, check colId:%d passed", pTopic->name, pCol->colId);
641!
1622
    }
1623

1624
  NEXT:
77✔
1625
    sdbRelease(pSdb, pTopic);
914✔
1626
    nodesDestroyNode(pAst);
914✔
1627
    nodesDestroyList(pNodeList);
914✔
1628
  }
1629
  TAOS_RETURN(code);
4,376✔
1630
}
1631

1632
static int32_t mndCheckAlterColForStream(SMnode *pMnode, const char *stbFullName, int64_t suid, col_id_t colId) {
4,376✔
1633
  return 0;
4,376✔
1634
  
1635
  /* STREAMTODO
1636
  int32_t code = 0;
1637
  SSdb   *pSdb = pMnode->pSdb;
1638
  void   *pIter = NULL;
1639
  while (1) {
1640
    SStreamObj *pStream = NULL;
1641
    pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
1642
    if (pIter == NULL) break;
1643

1644
    SNode *pAst = NULL;
1645
    if (nodesStringToNode(pStream->ast, &pAst) != 0) {
1646
      code = TSDB_CODE_MND_INVALID_STREAM_OPTION;
1647
      mError("stream:%s, create ast error", pStream->name);
1648
      sdbRelease(pSdb, pStream);
1649
      sdbCancelFetch(pSdb, pIter);
1650
      TAOS_RETURN(code);
1651
    }
1652

1653
    SNodeList *pNodeList = NULL;
1654
    if ((code = nodesCollectColumns((SSelectStmt *)pAst, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pNodeList)) !=
1655
        0) {
1656
      sdbRelease(pSdb, pStream);
1657
      sdbCancelFetch(pSdb, pIter);
1658
      TAOS_RETURN(code);
1659
    }
1660

1661
    SNode *pNode = NULL;
1662
    FOREACH(pNode, pNodeList) {
1663
      SColumnNode *pCol = (SColumnNode *)pNode;
1664

1665
      if (pCol->tableId != suid) {
1666
        mInfo("stream:%s, check colId:%d passed", pStream->name, pCol->colId);
1667
        goto NEXT;
1668
      }
1669
      if (pCol->colId > 0 && pCol->colId == colId) {
1670
        code = TSDB_CODE_MND_STREAM_MUST_BE_DELETED;
1671
        mError("stream:%s, check colId:%d conflicted", pStream->name, pCol->colId);
1672
        nodesDestroyNode(pAst);
1673
        nodesDestroyList(pNodeList);
1674
        sdbRelease(pSdb, pStream);
1675
        sdbCancelFetch(pSdb, pIter);
1676
        TAOS_RETURN(code);
1677
      }
1678
      mInfo("stream:%s, check colId:%d passed", pStream->name, pCol->colId);
1679
    }
1680

1681
  NEXT:
1682
    sdbRelease(pSdb, pStream);
1683
  }
1684
  TAOS_RETURN(code);
1685
*/  
1686
}
1687

1688
static int32_t mndCheckAlterColForTSma(SMnode *pMnode, const char *stbFullName, int64_t suid, col_id_t colId, bool isTag) {
4,376✔
1689
  int32_t code = 0;
4,376✔
1690
  SSdb   *pSdb = pMnode->pSdb;
4,376✔
1691
  void   *pIter = NULL;
4,376✔
1692
  while (1) {
×
1693
    SSmaObj *pSma = NULL;
4,376✔
1694
    pIter = sdbFetch(pSdb, SDB_SMA, pIter, (void **)&pSma);
4,376✔
1695
    if (pIter == NULL) break;
4,376!
1696

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

1700
    if (isTag) {
×
1701
      code = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TSMA;
×
1702
      mError("tsma:%s, check tag:%d conflicted", pSma->name, colId);
×
1703
      sdbRelease(pSdb, pSma);
×
1704
      sdbCancelFetch(pSdb, pIter);
×
1705
      TAOS_RETURN(code);
×
1706
    }
1707

1708
    SNode *pAst = NULL;
×
1709
    if (nodesStringToNode(pSma->ast, &pAst) != 0) {
×
1710
      code = TSDB_CODE_SDB_INVALID_DATA_CONTENT;
×
1711
      mError("tsma:%s, check tag and column modifiable, stb:%s suid:%" PRId64 " colId:%d failed since parse AST err",
×
1712
             pSma->name, stbFullName, suid, colId);
1713
      sdbCancelFetch(pSdb, pIter);
×
1714
      TAOS_RETURN(code);
×
1715
    }
1716

1717
    SNodeList *pNodeList = NULL;
×
1718
    if ((code = nodesCollectColumns((SSelectStmt *)pAst, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pNodeList)) !=
×
1719
        0) {
1720
      sdbCancelFetch(pSdb, pIter);
×
1721
      TAOS_RETURN(code);
×
1722
    }
1723
    SNode *pNode = NULL;
×
1724
    FOREACH(pNode, pNodeList) {
×
1725
      SColumnNode *pCol = (SColumnNode *)pNode;
×
1726
      mInfo("tsma:%s, check colId:%d tableId:%" PRId64, pSma->name, pCol->colId, pCol->tableId);
×
1727

1728
      if ((pCol->tableId != suid) && (pSma->stbUid != suid)) {
×
1729
        mInfo("tsma:%s, check colId:%d passed", pSma->name, pCol->colId);
×
1730
        goto NEXT;
×
1731
      }
1732
      if ((pCol->colId) > 0 && (pCol->colId == colId)) {
×
1733
        code = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TSMA;
×
1734
        mError("tsma:%s, check colId:%d conflicted", pSma->name, pCol->colId);
×
1735
        nodesDestroyNode(pAst);
×
1736
        nodesDestroyList(pNodeList);
×
1737
        sdbRelease(pSdb, pSma);
×
1738
        sdbCancelFetch(pSdb, pIter);
×
1739
        TAOS_RETURN(code);
×
1740
      }
1741
      mInfo("tsma:%s, check colId:%d passed", pSma->name, pCol->colId);
×
1742
    }
1743

1744
  NEXT:
×
1745
    sdbRelease(pSdb, pSma);
×
1746
    nodesDestroyNode(pAst);
×
1747
    nodesDestroyList(pNodeList);
×
1748
  }
1749
  TAOS_RETURN(code);
4,376✔
1750
}
1751

1752
int32_t mndCheckColAndTagModifiable(SMnode *pMnode, const char *stbFullName, int64_t suid, col_id_t colId, bool isTag) {
4,454✔
1753
  TAOS_CHECK_RETURN(mndCheckAlterColForTopic(pMnode, stbFullName, suid, colId));
4,454✔
1754
  TAOS_CHECK_RETURN(mndCheckAlterColForStream(pMnode, stbFullName, suid, colId));
4,376!
1755
  TAOS_CHECK_RETURN(mndCheckAlterColForTSma(pMnode, stbFullName, suid, colId, isTag));
4,376!
1756
  TAOS_RETURN(0);
4,376✔
1757
}
1758

1759
static int32_t mndDropSuperTableTag(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const char *tagName) {
368✔
1760
  int32_t code = 0;
368✔
1761
  int32_t tag = mndFindSuperTableTagIndex(pOld, tagName);
368✔
1762
  if (tag < 0) {
368✔
1763
    code = TSDB_CODE_MND_TAG_NOT_EXIST;
3✔
1764
    TAOS_RETURN(code);
3✔
1765
  }
1766

1767
  col_id_t colId = pOld->pTags[tag].colId;
365✔
1768
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId, true));
365✔
1769

1770
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
347!
1771

1772
  memmove(pNew->pTags + tag, pNew->pTags + tag + 1, sizeof(SSchema) * (pNew->numOfTags - tag - 1));
347✔
1773
  pNew->numOfTags--;
347✔
1774

1775
  pNew->tagVer++;
347✔
1776

1777
  // if (mndDropIndexByTag(pMnode, pOld, tagName) != 0) {
1778
  //   return -1;
1779
  // }
1780
  mInfo("stb:%s, start to drop tag %s", pNew->name, tagName);
347!
1781
  TAOS_RETURN(code);
347✔
1782
}
1783

1784
static int32_t mndAlterStbTagName(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, SArray *pFields) {
697✔
1785
  int32_t code = 0;
697✔
1786
  if ((int32_t)taosArrayGetSize(pFields) != 2) {
697!
1787
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
1788
    TAOS_RETURN(code);
×
1789
  }
1790

1791
  SField *pField0 = taosArrayGet(pFields, 0);
697✔
1792
  SField *pField1 = taosArrayGet(pFields, 1);
697✔
1793

1794
  const char *oldTagName = pField0->name;
697✔
1795
  const char *newTagName = pField1->name;
697✔
1796

1797
  int32_t tag = mndFindSuperTableTagIndex(pOld, oldTagName);
697✔
1798
  if (tag < 0) {
697✔
1799
    code = TSDB_CODE_MND_TAG_NOT_EXIST;
11✔
1800
    TAOS_RETURN(code);
11✔
1801
  }
1802

1803
  col_id_t colId = pOld->pTags[tag].colId;
686✔
1804
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId, true));
686✔
1805

1806
  if (mndFindSuperTableTagIndex(pOld, newTagName) >= 0) {
669✔
1807
    code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
15✔
1808
    TAOS_RETURN(code);
15✔
1809
  }
1810

1811
  if (mndFindSuperTableColumnIndex(pOld, newTagName) >= 0) {
654✔
1812
    code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
3✔
1813
    TAOS_RETURN(code);
3✔
1814
  }
1815

1816
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
651!
1817

1818
  SSchema *pSchema = (SSchema *)(pNew->pTags + tag);
651✔
1819
  memcpy(pSchema->name, newTagName, TSDB_COL_NAME_LEN);
651✔
1820

1821
  pNew->tagVer++;
651✔
1822
  mInfo("stb:%s, start to modify tag %s to %s", pNew->name, oldTagName, newTagName);
651!
1823
  TAOS_RETURN(code);
651✔
1824
}
1825

1826
static int32_t mndAlterStbTagBytes(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const SField *pField) {
517✔
1827
  int32_t code = 0;
517✔
1828
  int32_t tag = mndFindSuperTableTagIndex(pOld, pField->name);
517✔
1829
  if (tag < 0) {
517✔
1830
    code = TSDB_CODE_MND_TAG_NOT_EXIST;
3✔
1831
    TAOS_RETURN(code);
3✔
1832
  }
1833

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

1837
  uint32_t nLen = 0;
505✔
1838
  for (int32_t i = 0; i < pOld->numOfTags; ++i) {
19,474✔
1839
    nLen += (pOld->pTags[i].colId == colId) ? pField->bytes : pOld->pTags[i].bytes;
18,969✔
1840
  }
1841

1842
  if (nLen > TSDB_MAX_TAGS_LEN) {
505✔
1843
    code = TSDB_CODE_PAR_INVALID_TAGS_LENGTH;
290✔
1844
    TAOS_RETURN(code);
290✔
1845
  }
1846

1847
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
215!
1848

1849
  SSchema *pTag = pNew->pTags + tag;
215✔
1850

1851
  if (!(pTag->type == TSDB_DATA_TYPE_BINARY || pTag->type == TSDB_DATA_TYPE_VARBINARY ||
215!
1852
        pTag->type == TSDB_DATA_TYPE_NCHAR || pTag->type == TSDB_DATA_TYPE_GEOMETRY)) {
193!
1853
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
3✔
1854
    TAOS_RETURN(code);
3✔
1855
  }
1856

1857
  if (pField->bytes <= pTag->bytes) {
212✔
1858
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
74✔
1859
    TAOS_RETURN(code);
74✔
1860
  }
1861

1862
  pTag->bytes = pField->bytes;
138✔
1863
  pNew->tagVer++;
138✔
1864

1865
  mInfo("stb:%s, start to modify tag len %s to %d", pNew->name, pField->name, pField->bytes);
138!
1866
  TAOS_RETURN(code);
138✔
1867
}
1868

1869
static int32_t mndUpdateSuperTableColumnCompress(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, SArray *pField,
168✔
1870
                                                 int32_t nCols) {
1871
  // if (pColCmpr == NULL || colName == NULL) return -1;
1872

1873
  if (taosArrayGetSize(pField) != nCols) return TSDB_CODE_FAILED;
168!
1874
  TAOS_FIELD *p = taosArrayGet(pField, 0);
168✔
1875

1876
  int32_t code = 0;
168✔
1877
  int32_t idx = mndFindSuperTableColumnIndex(pOld, p->name);
168✔
1878
  if (idx == -1) {
168!
1879
    code = TSDB_CODE_MND_COLUMN_NOT_EXIST;
×
1880
    TAOS_RETURN(code);
×
1881
  }
1882
  SSchema *pTarget = &pOld->pColumns[idx];
168✔
1883
  col_id_t colId = pTarget->colId;
168✔
1884

1885
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
168!
1886
  code = validColCmprByType(pTarget->type, p->bytes);
168✔
1887
  if (code != TSDB_CODE_SUCCESS) {
168✔
1888
    TAOS_RETURN(code);
4✔
1889
  }
1890

1891
  int8_t updated = 0;
164✔
1892
  for (int i = 0; i < pNew->numOfColumns; i++) {
1,391!
1893
    SColCmpr *pCmpr = &pNew->pCmpr[i];
1,391✔
1894
    if (pCmpr->id == colId) {
1,391✔
1895
      uint32_t dst = 0;
164✔
1896
      updated = tUpdateCompress(pCmpr->alg, p->bytes, TSDB_COLVAL_COMPRESS_DISABLED, TSDB_COLVAL_LEVEL_DISABLED,
164✔
1897
                                TSDB_COLVAL_LEVEL_MEDIUM, &dst);
1898
      if (updated > 0) pCmpr->alg = dst;
164✔
1899
      break;
164✔
1900
    }
1901
  }
1902

1903
  if (updated == 0) {
164✔
1904
    code = TSDB_CODE_MND_COLUMN_COMPRESS_ALREADY_EXIST;
14✔
1905
    TAOS_RETURN(code);
14✔
1906
  } else if (updated == -1) {
150!
1907
    code = TSDB_CODE_TSC_COMPRESS_LEVEL_ERROR;
×
1908
    TAOS_RETURN(code);
×
1909
  }
1910

1911
  pNew->colVer++;
150✔
1912

1913
  TAOS_RETURN(code);
150✔
1914
}
1915
static int32_t mndAddSuperTableColumn(const SStbObj *pOld, SStbObj *pNew, const SMAlterStbReq* pReq, int32_t ncols,
4,676✔
1916
                                      int8_t withCompress) {
1917
  int32_t code = 0;
4,676✔
1918
  if (pOld->numOfColumns + ncols + pOld->numOfTags > TSDB_MAX_COLUMNS) {
4,676!
1919
    code = TSDB_CODE_MND_TOO_MANY_COLUMNS;
×
1920
    TAOS_RETURN(code);
×
1921
  }
1922

1923
  if ((code = grantCheck(TSDB_GRANT_TIMESERIES)) != 0) {
4,676!
1924
    TAOS_RETURN(code);
×
1925
  }
1926

1927
  if (!mndValidateSchema(pOld->pColumns, pOld->numOfColumns, pReq->pFields, TSDB_MAX_BYTES_PER_ROW)) {
4,676✔
1928
    code = TSDB_CODE_PAR_INVALID_ROW_LENGTH;
19✔
1929
    TAOS_RETURN(code);
19✔
1930
  }
1931

1932
  pNew->numOfColumns = pNew->numOfColumns + ncols;
4,657✔
1933

1934
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
4,657!
1935

1936
  if (pNew->nextColId < 0 || pNew->nextColId >= 0x7fff - ncols) {
4,657!
1937
    code = TSDB_CODE_OUT_OF_RANGE;
×
1938
    TAOS_RETURN(code);
×
1939
  }
1940

1941
  for (int32_t i = 0; i < ncols; i++) {
8,810✔
1942
    if (withCompress) {
4,657✔
1943
      SFieldWithOptions *pField = taosArrayGet(pReq->pFields, i);
460✔
1944
      if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
460!
1945
        code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
×
1946
        TAOS_RETURN(code);
×
1947
      }
1948

1949
      if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
460!
1950
        code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
×
1951
        TAOS_RETURN(code);
×
1952
      }
1953

1954
      SSchema *pSchema = &pNew->pColumns[pOld->numOfColumns + i];
460✔
1955
      pSchema->bytes = pField->bytes;
460✔
1956
      pSchema->type = pField->type;
460✔
1957
      memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
460✔
1958
      pSchema->colId = pNew->nextColId;
460✔
1959
      pNew->nextColId++;
460✔
1960

1961
      SColCmpr *pCmpr = &pNew->pCmpr[pOld->numOfColumns + i];
460✔
1962
      pCmpr->id = pSchema->colId;
460✔
1963
      pCmpr->alg = pField->compress;
460✔
1964
      mInfo("stb:%s, start to add column %s", pNew->name, pSchema->name);
460!
1965
    } else {
1966
      SField *pField = taosArrayGet(pReq->pFields, i);
4,197✔
1967
      if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
4,197✔
1968
        code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
498✔
1969
        TAOS_RETURN(code);
498✔
1970
      }
1971

1972
      if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
3,699✔
1973
        code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
6✔
1974
        TAOS_RETURN(code);
6✔
1975
      }
1976

1977
      SSchema *pSchema = &pNew->pColumns[pOld->numOfColumns + i];
3,693✔
1978
      pSchema->bytes = pField->bytes;
3,693✔
1979
      pSchema->type = pField->type;
3,693✔
1980
      memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
3,693✔
1981
      pSchema->colId = pNew->nextColId;
3,693✔
1982
      pNew->nextColId++;
3,693✔
1983

1984
      SColCmpr *pCmpr = &pNew->pCmpr[pOld->numOfColumns + i];
3,693✔
1985
      pCmpr->id = pSchema->colId;
3,693✔
1986
      pCmpr->alg = createDefaultColCmprByType(pSchema->type);
3,693✔
1987
      mInfo("stb:%s, start to add column %s", pNew->name, pSchema->name);
3,693!
1988
    }
1989
  }
1990
  // 1. old schema already has extschemas
1991
  // 2. new schema has extschemas
1992
  if (pReq->pTypeMods || pOld->pExtSchemas) {
4,153!
1993
    if (!pNew->pExtSchemas) {
4,147✔
1994
      // all ext schemas reset to zero
1995
      pNew->pExtSchemas = taosMemoryCalloc(pNew->numOfColumns, sizeof(SExtSchema));
69!
1996
      if (!pNew->pExtSchemas) TAOS_RETURN(terrno);
69!
1997
    }
1998
    if (pOld->pExtSchemas) {
4,147✔
1999
      memcpy(pNew->pExtSchemas, pOld->pExtSchemas, pOld->numOfColumns * sizeof(SExtSchema));
4,078✔
2000
    }
2001
    if (taosArrayGetSize(pReq->pTypeMods) > 0) {
4,147!
2002
      // copy added column ext schema
2003
      for (int32_t i = 0; i < ncols; ++i) {
8,294✔
2004
        pNew->pColumns[pOld->numOfColumns + i].flags |= COL_HAS_TYPE_MOD;
4,147✔
2005
        pNew->pExtSchemas[pOld->numOfColumns + i].typeMod = *(STypeMod *)taosArrayGet(pReq->pTypeMods, i);
4,147✔
2006
      }
2007
    }
2008
  }
2009

2010
  pNew->colVer++;
4,153✔
2011
  TAOS_RETURN(code);
4,153✔
2012
}
2013

2014
static int32_t mndDropSuperTableColumn(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const char *colName) {
2,174✔
2015
  int32_t code = 0;
2,174✔
2016
  int32_t col = mndFindSuperTableColumnIndex(pOld, colName);
2,174✔
2017
  if (col < 0) {
2,174✔
2018
    code = TSDB_CODE_MND_COLUMN_NOT_EXIST;
6✔
2019
    TAOS_RETURN(code);
6✔
2020
  }
2021

2022
  if (col == 0) {
2,168✔
2023
    code = TSDB_CODE_MND_INVALID_STB_ALTER_OPTION;
5✔
2024
    TAOS_RETURN(code);
5✔
2025
  }
2026

2027
  if (pOld->numOfColumns == 2) {
2,163✔
2028
    code = TSDB_CODE_PAR_INVALID_DROP_COL;
3✔
2029
    TAOS_RETURN(code);
3✔
2030
  }
2031

2032
  col_id_t colId = pOld->pColumns[col].colId;
2,160✔
2033
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId, false));
2,160✔
2034

2035
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
2,138!
2036

2037
  int32_t sz = pNew->numOfColumns - col - 1;
2,138✔
2038
  memmove(pNew->pColumns + col, pNew->pColumns + col + 1, sizeof(SSchema) * sz);
2,138✔
2039
  memmove(pNew->pCmpr + col, pNew->pCmpr + col + 1, sizeof(SColCmpr) * sz);
2,138✔
2040
  if (pOld->pExtSchemas) {
2,138✔
2041
    memmove(pNew->pExtSchemas + col, pNew->pExtSchemas + col + 1, sizeof(SExtSchema) * sz);
2,080✔
2042
  }
2043
  pNew->numOfColumns--;
2,138✔
2044

2045
  pNew->colVer++;
2,138✔
2046
  mInfo("stb:%s, start to drop col %s", pNew->name, colName);
2,138!
2047
  TAOS_RETURN(code);
2,138✔
2048
}
2049

2050
static int32_t mndAlterStbColumnBytes(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const SField *pField) {
807✔
2051
  int32_t code = 0;
807✔
2052
  int32_t col = mndFindSuperTableColumnIndex(pOld, pField->name);
807✔
2053
  if (col < 0) {
807✔
2054
    code = TSDB_CODE_MND_COLUMN_NOT_EXIST;
6✔
2055
    TAOS_RETURN(code);
6✔
2056
  }
2057

2058
  col_id_t colId = pOld->pColumns[col].colId;
801✔
2059

2060
  uint32_t nLen = 0;
801✔
2061
  for (int32_t i = 0; i < pOld->numOfColumns; ++i) {
31,101✔
2062
    nLen += (pOld->pColumns[i].colId == colId) ? pField->bytes : pOld->pColumns[i].bytes;
30,300✔
2063
  }
2064

2065
  if (nLen > TSDB_MAX_BYTES_PER_ROW) {
801✔
2066
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
72✔
2067
    TAOS_RETURN(code);
72✔
2068
  }
2069

2070
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId, false));
729✔
2071

2072
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
717!
2073

2074
  SSchema *pCol = pNew->pColumns + col;
717✔
2075
  if (!(pCol->type == TSDB_DATA_TYPE_BINARY || pCol->type == TSDB_DATA_TYPE_VARBINARY ||
717✔
2076
        pCol->type == TSDB_DATA_TYPE_NCHAR || pCol->type == TSDB_DATA_TYPE_GEOMETRY)) {
675!
2077
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
3✔
2078
    TAOS_RETURN(code);
3✔
2079
  }
2080

2081
  if (pField->bytes <= pCol->bytes) {
714✔
2082
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
331✔
2083
    TAOS_RETURN(code);
331✔
2084
  }
2085

2086
  pCol->bytes = pField->bytes;
383✔
2087
  pNew->colVer++;
383✔
2088

2089
  mInfo("stb:%s, start to modify col len %s to %d", pNew->name, pField->name, pField->bytes);
383!
2090
  TAOS_RETURN(code);
383✔
2091
}
2092

2093
static int32_t mndSetAlterStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
8,574✔
2094
  int32_t  code = 0;
8,574✔
2095
  SSdbRaw *pRedoRaw = mndStbActionEncode(pStb);
8,574✔
2096
  if (pRedoRaw == NULL) {
8,574!
2097
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2098
    if (terrno != 0) code = terrno;
×
2099
    TAOS_RETURN(code);
×
2100
  }
2101
  if ((code = mndTransAppendPrepareLog(pTrans, pRedoRaw)) != 0) {
8,574!
2102
    sdbFreeRaw(pRedoRaw);
×
2103
    TAOS_RETURN(code);
×
2104
  }
2105
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY));
8,574!
2106

2107
  TAOS_RETURN(code);
8,574✔
2108
}
2109

2110
static int32_t mndSetAlterStbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
8,574✔
2111
  int32_t  code = 0;
8,574✔
2112
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
8,574✔
2113
  if (pCommitRaw == NULL) {
8,574!
2114
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2115
    if (terrno != 0) code = terrno;
×
2116
    TAOS_RETURN(code);
×
2117
  }
2118
  if ((code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
8,574!
2119
    sdbFreeRaw(pCommitRaw);
×
2120
    TAOS_RETURN(code);
×
2121
  }
2122
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
8,574!
2123

2124
  TAOS_RETURN(code);
8,574✔
2125
}
2126

2127
static int32_t mndSetAlterStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb, void *alterOriData,
8,574✔
2128
                                         int32_t alterOriDataLen) {
2129
  int32_t code = 0;
8,574✔
2130
  SSdb   *pSdb = pMnode->pSdb;
8,574✔
2131
  SVgObj *pVgroup = NULL;
8,574✔
2132
  void   *pIter = NULL;
8,574✔
2133
  int32_t contLen;
2134

2135
  while (1) {
22,291✔
2136
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
30,865✔
2137
    if (pIter == NULL) break;
30,865✔
2138
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
22,291✔
2139
      sdbRelease(pSdb, pVgroup);
8,910✔
2140
      continue;
8,910✔
2141
    }
2142

2143
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, alterOriData, alterOriDataLen);
13,381✔
2144
    if (pReq == NULL) {
13,381!
2145
      sdbCancelFetch(pSdb, pIter);
×
2146
      sdbRelease(pSdb, pVgroup);
×
2147
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2148
      if (terrno != 0) code = terrno;
×
2149
      TAOS_RETURN(code);
×
2150
    }
2151
    STransAction action = {0};
13,381✔
2152
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
13,381✔
2153
    action.pCont = pReq;
13,381✔
2154
    action.contLen = contLen;
13,381✔
2155
    action.msgType = TDMT_VND_ALTER_STB;
13,381✔
2156
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
13,381!
2157
      taosMemoryFree(pReq);
×
2158
      sdbCancelFetch(pSdb, pIter);
×
2159
      sdbRelease(pSdb, pVgroup);
×
2160
      TAOS_RETURN(code);
×
2161
    }
2162
    sdbRelease(pSdb, pVgroup);
13,381✔
2163
  }
2164

2165
  TAOS_RETURN(code);
8,574✔
2166
}
2167

2168
static int32_t mndSetAlterStbRedoActions2(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb,
×
2169
                                          void *alterOriData, int32_t alterOriDataLen) {
2170
  int32_t code = 0;
×
2171
  SSdb   *pSdb = pMnode->pSdb;
×
2172
  SVgObj *pVgroup = NULL;
×
2173
  void   *pIter = NULL;
×
2174
  int32_t contLen;
2175

2176
  while (1) {
×
2177
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
×
2178
    if (pIter == NULL) break;
×
2179
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
×
2180
      sdbRelease(pSdb, pVgroup);
×
2181
      continue;
×
2182
    }
2183

2184
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, alterOriData, alterOriDataLen);
×
2185
    if (pReq == NULL) {
×
2186
      sdbCancelFetch(pSdb, pIter);
×
2187
      sdbRelease(pSdb, pVgroup);
×
2188
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2189
      if (terrno != 0) code = terrno;
×
2190
      TAOS_RETURN(code);
×
2191
    }
2192
    STransAction action = {0};
×
2193
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
×
2194
    action.pCont = pReq;
×
2195
    action.contLen = contLen;
×
2196
    action.msgType = TDMT_VND_CREATE_INDEX;
×
2197
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
×
2198
      taosMemoryFree(pReq);
×
2199
      sdbCancelFetch(pSdb, pIter);
×
2200
      sdbRelease(pSdb, pVgroup);
×
2201
      TAOS_RETURN(code);
×
2202
    }
2203
    sdbRelease(pSdb, pVgroup);
×
2204
  }
2205

2206
  TAOS_RETURN(code);
×
2207
}
2208

2209
static int32_t mndBuildStbSchemaImp(SMnode *pMnode, SDbObj *pDb, SStbObj *pStb, const char *tbName, STableMetaRsp *pRsp, bool refByStm) {
1,957,845✔
2210
  int32_t code = 0;
1,957,845✔
2211
  taosRLockLatch(&pStb->lock);
1,957,845✔
2212

2213
  int32_t totalCols = pStb->numOfColumns + pStb->numOfTags;
1,958,044✔
2214
  pRsp->pSchemas = taosMemoryCalloc(totalCols, sizeof(SSchema));
1,958,044!
2215
  if (pRsp->pSchemas == NULL) {
1,957,822!
2216
    taosRUnLockLatch(&pStb->lock);
×
2217
    code = terrno;
×
2218
    TAOS_RETURN(code);
×
2219
  }
2220
  pRsp->pSchemaExt = taosMemoryCalloc(pStb->numOfColumns, sizeof(SSchemaExt));
1,957,822!
2221
  if (pRsp->pSchemaExt == NULL) {
1,957,784!
2222
    taosRUnLockLatch(&pStb->lock);
×
2223
    code = terrno;
×
2224
    TAOS_RETURN(code);
×
2225
  }
2226
  pRsp->numOfColRefs = 0;
1,957,784✔
2227
  pRsp->pColRefs = NULL;
1,957,784✔
2228
  tstrncpy(pRsp->dbFName, pStb->db, sizeof(pRsp->dbFName));
1,957,784✔
2229
  tstrncpy(pRsp->tbName, tbName, sizeof(pRsp->tbName));
1,957,784✔
2230
  tstrncpy(pRsp->stbName, tbName, sizeof(pRsp->stbName));
1,957,784✔
2231
  pRsp->dbId = pDb->uid;
1,957,784✔
2232
  pRsp->numOfTags = pStb->numOfTags;
1,957,784✔
2233
  pRsp->numOfColumns = pStb->numOfColumns;
1,957,784✔
2234
  pRsp->precision = pDb->cfg.precision;
1,957,784✔
2235
  pRsp->tableType = TSDB_SUPER_TABLE;
1,957,784✔
2236
  pRsp->sversion = pStb->colVer;
1,957,784✔
2237
  pRsp->tversion = pStb->tagVer;
1,957,784✔
2238
  pRsp->suid = pStb->uid;
1,957,784✔
2239
  pRsp->tuid = pStb->uid;
1,957,784✔
2240
  pRsp->virtualStb = pStb->virtualStb;
1,957,784✔
2241

2242
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
51,403,709✔
2243
    SSchema *pSchema = &pRsp->pSchemas[i];
49,445,925✔
2244
    SSchema *pSrcSchema = &pStb->pColumns[i];
49,445,925✔
2245
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
49,445,925✔
2246
    pSchema->type = pSrcSchema->type;
49,445,925✔
2247
    pSchema->flags = pSrcSchema->flags;
49,445,925✔
2248
    pSchema->colId = pSrcSchema->colId;
49,445,925✔
2249
    pSchema->bytes = pSrcSchema->bytes;
49,445,925✔
2250
  }
2251
  
2252
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
30,614,591✔
2253
    SSchema *pSchema = &pRsp->pSchemas[i + pStb->numOfColumns];
28,656,807✔
2254
    SSchema *pSrcSchema = &pStb->pTags[i];
28,656,807✔
2255
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
28,656,807✔
2256
    pSchema->type = pSrcSchema->type;
28,656,807✔
2257
    pSchema->flags = pSrcSchema->flags;
28,656,807✔
2258
    pSchema->colId = pSrcSchema->colId;
28,656,807✔
2259
    pSchema->bytes = pSrcSchema->bytes;
28,656,807✔
2260
  }
2261

2262
  if (refByStm) {
1,957,784✔
2263
    mndStreamUpdateTagsRefFlag(pMnode, pStb->uid, &pRsp->pSchemas[pStb->numOfColumns], pStb->numOfTags);
1,942,396✔
2264
  }
2265

2266
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
51,416,759✔
2267
    SColCmpr   *pCmpr = &pStb->pCmpr[i];
49,458,724✔
2268
    SSchemaExt *pSchEx = &pRsp->pSchemaExt[i];
49,458,724✔
2269
    pSchEx->colId = pCmpr->id;
49,458,724✔
2270
    pSchEx->compress = pCmpr->alg;
49,458,724✔
2271
    if (pStb->pExtSchemas) {
49,458,724✔
2272
      pSchEx->typeMod = pStb->pExtSchemas[i].typeMod;
1,253,122✔
2273
    }
2274
  }
2275

2276
  taosRUnLockLatch(&pStb->lock);
1,958,035✔
2277
  TAOS_RETURN(code);
1,958,016✔
2278
}
2279

2280
static int32_t mndBuildStbCfgImp(SDbObj *pDb, SStbObj *pStb, const char *tbName, STableCfgRsp *pRsp) {
100✔
2281
  int32_t code = 0;
100✔
2282
  taosRLockLatch(&pStb->lock);
100✔
2283

2284
  int32_t totalCols = pStb->numOfColumns + pStb->numOfTags;
100✔
2285
  pRsp->pSchemas = taosMemoryCalloc(totalCols, sizeof(SSchema));
100!
2286
  if (pRsp->pSchemas == NULL) {
100!
2287
    taosRUnLockLatch(&pStb->lock);
×
2288
    code = terrno;
×
2289
    TAOS_RETURN(code);
×
2290
  }
2291

2292
  tstrncpy(pRsp->dbFName, pStb->db, sizeof(pRsp->dbFName));
100✔
2293
  tstrncpy(pRsp->tbName, tbName, sizeof(pRsp->tbName));
100✔
2294
  tstrncpy(pRsp->stbName, tbName, sizeof(pRsp->stbName));
100✔
2295
  pRsp->numOfTags = pStb->numOfTags;
100✔
2296
  pRsp->numOfColumns = pStb->numOfColumns;
100✔
2297
  pRsp->tableType = TSDB_SUPER_TABLE;
100✔
2298
  pRsp->delay1 = pStb->maxdelay[0];
100✔
2299
  pRsp->delay2 = pStb->maxdelay[1];
100✔
2300
  pRsp->watermark1 = pStb->watermark[0];
100✔
2301
  pRsp->watermark2 = pStb->watermark[1];
100✔
2302
  pRsp->ttl = pStb->ttl;
100✔
2303
  pRsp->keep = pStb->keep;
100✔
2304
  pRsp->commentLen = pStb->commentLen;
100✔
2305
  if (pStb->commentLen > 0) {
100!
2306
    pRsp->pComment = taosStrdup(pStb->comment);
×
2307
  }
2308

2309
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
894✔
2310
    SSchema *pSchema = &pRsp->pSchemas[i];
794✔
2311
    SSchema *pSrcSchema = &pStb->pColumns[i];
794✔
2312
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
794✔
2313
    pSchema->type = pSrcSchema->type;
794✔
2314
    pSchema->flags = pSrcSchema->flags;
794✔
2315
    pSchema->colId = pSrcSchema->colId;
794✔
2316
    pSchema->bytes = pSrcSchema->bytes;
794✔
2317
  }
2318

2319
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
512✔
2320
    SSchema *pSchema = &pRsp->pSchemas[i + pStb->numOfColumns];
412✔
2321
    SSchema *pSrcSchema = &pStb->pTags[i];
412✔
2322
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
412✔
2323
    pSchema->type = pSrcSchema->type;
412✔
2324
    pSchema->flags = pSrcSchema->flags;
412✔
2325
    pSchema->colId = pSrcSchema->colId;
412✔
2326
    pSchema->bytes = pSrcSchema->bytes;
412✔
2327
  }
2328

2329
  if (pStb->numOfFuncs > 0) {
100!
2330
    pRsp->pFuncs = taosArrayDup(pStb->pFuncs, NULL);
×
2331
  }
2332

2333
  pRsp->pSchemaExt = taosMemoryCalloc(pStb->numOfColumns, sizeof(SSchemaExt));
100!
2334
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
894✔
2335
    SColCmpr *pCmpr = &pStb->pCmpr[i];
794✔
2336

2337
    SSchemaExt *pSchExt = &pRsp->pSchemaExt[i];
794✔
2338
    pSchExt->colId = pCmpr->id;
794✔
2339
    pSchExt->compress = pCmpr->alg;
794✔
2340
    if (pStb->pExtSchemas) {
794✔
2341
      pSchExt->typeMod = pStb->pExtSchemas[i].typeMod;
33✔
2342
    }
2343
  }
2344
  pRsp->virtualStb = pStb->virtualStb;
100✔
2345
  pRsp->pColRefs = NULL;
100✔
2346

2347
  taosRUnLockLatch(&pStb->lock);
100✔
2348
  TAOS_RETURN(code);
100✔
2349
}
2350

2351
static int32_t mndValidateStbVersion(SMnode *pMnode, SSTableVersion *pStbVer, bool *schema, bool *sma) {
37,512✔
2352
  int32_t code = 0;
37,512✔
2353
  char    tbFName[TSDB_TABLE_FNAME_LEN] = {0};
37,512✔
2354
  snprintf(tbFName, sizeof(tbFName), "%s.%s", pStbVer->dbFName, pStbVer->stbName);
37,512✔
2355

2356
  SDbObj *pDb = mndAcquireDb(pMnode, pStbVer->dbFName);
37,512✔
2357
  if (pDb == NULL) {
37,512✔
2358
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
30✔
2359
    TAOS_RETURN(code);
30✔
2360
  }
2361

2362
  if (pDb->uid != pStbVer->dbId) {
37,482✔
2363
    mndReleaseDb(pMnode, pDb);
52✔
2364
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
52✔
2365
    TAOS_RETURN(code);
52✔
2366
  }
2367

2368
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
37,430✔
2369
  if (pStb == NULL) {
37,430✔
2370
    mndReleaseDb(pMnode, pDb);
48✔
2371
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
48✔
2372
    TAOS_RETURN(code);
48✔
2373
  }
2374

2375
  taosRLockLatch(&pStb->lock);
37,382✔
2376

2377
  if (pStbVer->sversion != pStb->colVer || pStbVer->tversion != pStb->tagVer) {
37,382✔
2378
    *schema = true;
316✔
2379
  } else {
2380
    *schema = false;
37,066✔
2381
  }
2382

2383
  if (pStbVer->smaVer && pStbVer->smaVer != pStb->smaVer) {
37,382!
2384
    *sma = true;
×
2385
  } else {
2386
    *sma = false;
37,382✔
2387
  }
2388

2389
  taosRUnLockLatch(&pStb->lock);
37,382✔
2390

2391
  mndReleaseDb(pMnode, pDb);
37,382✔
2392
  mndReleaseStb(pMnode, pStb);
37,382✔
2393
  return TSDB_CODE_SUCCESS;
37,382✔
2394
}
2395

2396
static int32_t mndBuildStbSchema(SMnode *pMnode, const char *dbFName, const char *tbName, STableMetaRsp *pRsp, bool refByStm) {
1,945,650✔
2397
  int32_t code = 0;
1,945,650✔
2398
  char    tbFName[TSDB_TABLE_FNAME_LEN] = {0};
1,945,650✔
2399
  snprintf(tbFName, sizeof(tbFName), "%s.%s", dbFName, tbName);
1,945,650✔
2400

2401
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
1,945,650✔
2402
  if (pDb == NULL) {
1,945,502!
2403
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
2404
    TAOS_RETURN(code);
×
2405
  }
2406

2407
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
1,945,502✔
2408
  if (pStb == NULL) {
1,945,504✔
2409
    mndReleaseDb(pMnode, pDb);
2,876✔
2410
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
2,876✔
2411
    TAOS_RETURN(code);
2,876✔
2412
  }
2413

2414
  code = mndBuildStbSchemaImp(pMnode, pDb, pStb, tbName, pRsp, refByStm);
1,942,628✔
2415
  mndReleaseDb(pMnode, pDb);
1,942,701✔
2416
  mndReleaseStb(pMnode, pStb);
1,942,775✔
2417
  TAOS_RETURN(code);
1,942,780✔
2418
}
2419

2420
static int32_t mndBuildStbCfg(SMnode *pMnode, const char *dbFName, const char *tbName, STableCfgRsp *pRsp) {
100✔
2421
  int32_t code = 0;
100✔
2422
  char    tbFName[TSDB_TABLE_FNAME_LEN] = {0};
100✔
2423
  snprintf(tbFName, sizeof(tbFName), "%s.%s", dbFName, tbName);
100✔
2424

2425
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
100✔
2426
  if (pDb == NULL) {
100!
2427
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
2428
    TAOS_RETURN(code);
×
2429
  }
2430

2431
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
100✔
2432
  if (pStb == NULL) {
100!
2433
    mndReleaseDb(pMnode, pDb);
×
2434
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
×
2435
    TAOS_RETURN(code);
×
2436
  }
2437

2438
  code = mndBuildStbCfgImp(pDb, pStb, tbName, pRsp);
100✔
2439

2440
  mndReleaseDb(pMnode, pDb);
100✔
2441
  mndReleaseStb(pMnode, pStb);
100✔
2442
  TAOS_RETURN(code);
100✔
2443
}
2444

2445
static int32_t mndBuildSMAlterStbRsp(SDbObj *pDb, SStbObj *pObj, void **pCont, int32_t *pLen) {
8,462✔
2446
  int32_t       code = 0;
8,462✔
2447
  SEncoder      ec = {0};
8,462✔
2448
  uint32_t      contLen = 0;
8,462✔
2449
  SMAlterStbRsp alterRsp = {0};
8,462✔
2450
  SName         name = {0};
8,462✔
2451
  TAOS_CHECK_RETURN(tNameFromString(&name, pObj->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
8,462!
2452

2453
  alterRsp.pMeta = taosMemoryCalloc(1, sizeof(STableMetaRsp));
8,462!
2454
  if (NULL == alterRsp.pMeta) {
8,462!
2455
    code = terrno;
×
2456
    TAOS_RETURN(code);
×
2457
  }
2458

2459
  code = mndBuildStbSchemaImp(NULL, pDb, pObj, name.tname, alterRsp.pMeta, false);
8,462✔
2460
  if (code) {
8,462!
2461
    tFreeSMAlterStbRsp(&alterRsp);
×
2462
    return code;
×
2463
  }
2464

2465
  tEncodeSize(tEncodeSMAlterStbRsp, &alterRsp, contLen, code);
8,462!
2466
  if (code) {
8,462!
2467
    tFreeSMAlterStbRsp(&alterRsp);
×
2468
    return code;
×
2469
  }
2470

2471
  void *cont = taosMemoryMalloc(contLen);
8,462!
2472
  if (NULL == cont) {
8,462!
2473
    code = terrno;
×
2474
    tFreeSMAlterStbRsp(&alterRsp);
×
2475
    TAOS_RETURN(code);
×
2476
  }
2477
  tEncoderInit(&ec, cont, contLen);
8,462✔
2478
  code = tEncodeSMAlterStbRsp(&ec, &alterRsp);
8,462✔
2479
  tEncoderClear(&ec);
8,462✔
2480

2481
  tFreeSMAlterStbRsp(&alterRsp);
8,462✔
2482

2483
  if (code < 0) TAOS_RETURN(code);
8,462!
2484

2485
  *pCont = cont;
8,462✔
2486
  *pLen = contLen;
8,462✔
2487

2488
  TAOS_RETURN(code);
8,462✔
2489
}
2490

2491
int32_t mndBuildSMCreateStbRsp(SMnode *pMnode, char *dbFName, char *stbFName, void **pCont, int32_t *pLen) {
6,855✔
2492
  int32_t code = -1;
6,855✔
2493
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
6,855✔
2494
  if (NULL == pDb) {
6,855!
2495
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2496
    if (terrno != 0) code = terrno;
×
2497
    TAOS_RETURN(code);
×
2498
  }
2499

2500
  SStbObj *pObj = mndAcquireStb(pMnode, stbFName);
6,855✔
2501
  if (NULL == pObj) {
6,855✔
2502
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
2✔
2503
    if (terrno != 0) code = terrno;
2!
2504
    goto _OVER;
2✔
2505
  }
2506

2507
  SEncoder       ec = {0};
6,853✔
2508
  uint32_t       contLen = 0;
6,853✔
2509
  SMCreateStbRsp stbRsp = {0};
6,853✔
2510
  SName          name = {0};
6,853✔
2511
  TAOS_CHECK_GOTO(tNameFromString(&name, pObj->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE), NULL, _OVER);
6,853!
2512

2513
  stbRsp.pMeta = taosMemoryCalloc(1, sizeof(STableMetaRsp));
6,853!
2514
  if (NULL == stbRsp.pMeta) {
6,853!
2515
    code = terrno;
×
2516
    goto _OVER;
×
2517
  }
2518

2519
  code = mndBuildStbSchemaImp(NULL, pDb, pObj, name.tname, stbRsp.pMeta, false);
6,853✔
2520
  if (code) {
6,853!
2521
    tFreeSMCreateStbRsp(&stbRsp);
×
2522
    goto _OVER;
×
2523
  }
2524

2525
  tEncodeSize(tEncodeSMCreateStbRsp, &stbRsp, contLen, code);
6,853!
2526
  if (code) {
6,853!
2527
    tFreeSMCreateStbRsp(&stbRsp);
×
2528
    goto _OVER;
×
2529
  }
2530

2531
  void *cont = taosMemoryMalloc(contLen);
6,853!
2532
  if (NULL == cont) {
6,853!
2533
    code = terrno;
×
2534
    tFreeSMCreateStbRsp(&stbRsp);
×
2535
    goto _OVER;
×
2536
  }
2537
  tEncoderInit(&ec, cont, contLen);
6,853✔
2538
  TAOS_CHECK_GOTO(tEncodeSMCreateStbRsp(&ec, &stbRsp), NULL, _OVER);
6,853!
2539
  tEncoderClear(&ec);
6,853✔
2540

2541
  tFreeSMCreateStbRsp(&stbRsp);
6,853✔
2542

2543
  *pCont = cont;
6,853✔
2544
  *pLen = contLen;
6,853✔
2545

2546
  code = 0;
6,853✔
2547

2548
_OVER:
6,855✔
2549
  if (pObj) {
6,855✔
2550
    mndReleaseStb(pMnode, pObj);
6,853✔
2551
  }
2552

2553
  if (pDb) {
6,855!
2554
    mndReleaseDb(pMnode, pDb);
6,855✔
2555
  }
2556

2557
  TAOS_RETURN(code);
6,855✔
2558
}
2559

2560
static int32_t mndAlterStbImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
7,580✔
2561
                              void *alterOriData, int32_t alterOriDataLen) {
2562
  int32_t code = -1;
7,580✔
2563
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "alter-stb");
7,580✔
2564
  if (pTrans == NULL) {
7,580!
2565
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2566
    if (terrno != 0) code = terrno;
×
2567
    goto _OVER;
×
2568
  }
2569

2570
  mInfo("trans:%d, used to alter stb:%s", pTrans->id, pStb->name);
7,580!
2571
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
7,580✔
2572
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
7,580✔
2573

2574
  if (needRsp) {
7,576✔
2575
    void   *pCont = NULL;
7,464✔
2576
    int32_t contLen = 0;
7,464✔
2577
    TAOS_CHECK_GOTO(mndBuildSMAlterStbRsp(pDb, pStb, &pCont, &contLen), NULL, _OVER);
7,464!
2578
    mndTransSetRpcRsp(pTrans, pCont, contLen);
7,464✔
2579
  }
2580

2581
  TAOS_CHECK_GOTO(mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
7,576!
2582
  TAOS_CHECK_GOTO(mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
7,576!
2583
  TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
7,576!
2584
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
7,576!
2585

2586
  code = 0;
7,576✔
2587

2588
_OVER:
7,580✔
2589
  mndTransDrop(pTrans);
7,580✔
2590
  TAOS_RETURN(code);
7,580✔
2591
}
2592

2593
static int32_t mndAlterStbAndUpdateTagIdxImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
998✔
2594
                                             void *alterOriData, int32_t alterOriDataLen, const SMAlterStbReq *pAlter) {
2595
  int32_t code = -1;
998✔
2596
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "alter-stb");
998✔
2597
  if (pTrans == NULL) {
998!
2598
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2599
    if (terrno != 0) code = terrno;
×
2600
    goto _OVER;
×
2601
  }
2602

2603
  mInfo("trans:%d, used to alter stb:%s", pTrans->id, pStb->name);
998!
2604
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
998✔
2605

2606
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
998!
2607

2608
  if (needRsp) {
998!
2609
    void   *pCont = NULL;
998✔
2610
    int32_t contLen = 0;
998✔
2611
    TAOS_CHECK_GOTO(mndBuildSMAlterStbRsp(pDb, pStb, &pCont, &contLen), NULL, _OVER);
998!
2612
    mndTransSetRpcRsp(pTrans, pCont, contLen);
998✔
2613
  }
2614

2615
  if (pAlter->alterType == TSDB_ALTER_TABLE_DROP_TAG) {
998✔
2616
    SIdxObj idxObj = {0};
347✔
2617
    SField *pField0 = taosArrayGet(pAlter->pFields, 0);
347✔
2618
    bool    exist = false;
347✔
2619
    if (mndGetIdxsByTagName(pMnode, pStb, pField0->name, &idxObj) == 0) {
347✔
2620
      exist = true;
9✔
2621
    }
2622
    TAOS_CHECK_GOTO(mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
347!
2623
    TAOS_CHECK_GOTO(mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
347!
2624

2625
    if (exist == true) {
347✔
2626
      TAOS_CHECK_GOTO(mndSetDropIdxPrepareLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
9!
2627
      TAOS_CHECK_GOTO(mndSetDropIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
9!
2628
    }
2629

2630
    TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
347!
2631
    TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
347!
2632

2633
  } else if (pAlter->alterType == TSDB_ALTER_TABLE_UPDATE_TAG_NAME) {
651!
2634
    SIdxObj     idxObj = {0};
651✔
2635
    SField     *pField0 = taosArrayGet(pAlter->pFields, 0);
651✔
2636
    SField     *pField1 = taosArrayGet(pAlter->pFields, 1);
651✔
2637
    const char *oTagName = pField0->name;
651✔
2638
    const char *nTagName = pField1->name;
651✔
2639
    bool        exist = false;
651✔
2640

2641
    if (mndGetIdxsByTagName(pMnode, pStb, pField0->name, &idxObj) == 0) {
651✔
2642
      exist = true;
27✔
2643
    }
2644

2645
    TAOS_CHECK_GOTO(mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
651!
2646
    TAOS_CHECK_GOTO(mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
651!
2647

2648
    if (exist == true) {
651✔
2649
      memcpy(idxObj.colName, nTagName, strlen(nTagName));
27✔
2650
      idxObj.colName[strlen(nTagName)] = 0;
27✔
2651
      TAOS_CHECK_GOTO(mndSetAlterIdxPrepareLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
27!
2652
      TAOS_CHECK_GOTO(mndSetAlterIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
27!
2653
    }
2654

2655
    TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
651!
2656
    TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
651!
2657
  }
2658
  code = 0;
998✔
2659

2660
_OVER:
998✔
2661
  mndTransDrop(pTrans);
998✔
2662
  TAOS_RETURN(code);
998✔
2663
}
2664

2665
static int32_t mndAlterStb(SMnode *pMnode, SRpcMsg *pReq, const SMAlterStbReq *pAlter, SDbObj *pDb, SStbObj *pOld) {
10,103✔
2666
  bool    needRsp = true;
10,103✔
2667
  int32_t code = -1;
10,103✔
2668
  SField *pField0 = NULL;
10,103✔
2669

2670
  SStbObj stbObj = {0};
10,103✔
2671
  taosRLockLatch(&pOld->lock);
10,103✔
2672
  memcpy(&stbObj, pOld, sizeof(SStbObj));
10,103✔
2673
  taosRUnLockLatch(&pOld->lock);
10,103✔
2674
  stbObj.pColumns = NULL;
10,103✔
2675
  stbObj.pTags = NULL;
10,103✔
2676
  stbObj.pFuncs = NULL;
10,103✔
2677
  stbObj.pCmpr = NULL;
10,103✔
2678
  stbObj.pExtSchemas = NULL;
10,103✔
2679
  stbObj.updateTime = taosGetTimestampMs();
10,103✔
2680
  stbObj.lock = 0;
10,103✔
2681
  stbObj.virtualStb = pOld->virtualStb;
10,103✔
2682
  bool updateTagIndex = false;
10,103✔
2683
  switch (pAlter->alterType) {
10,103!
2684
    case TSDB_ALTER_TABLE_ADD_TAG:
659✔
2685
      code = mndAddSuperTableTag(pOld, &stbObj, pAlter->pFields, pAlter->numOfFields);
659✔
2686
      break;
659✔
2687
    case TSDB_ALTER_TABLE_DROP_TAG:
368✔
2688
      pField0 = taosArrayGet(pAlter->pFields, 0);
368✔
2689
      code = mndDropSuperTableTag(pMnode, pOld, &stbObj, pField0->name);
368✔
2690
      updateTagIndex = true;
368✔
2691
      break;
368✔
2692
    case TSDB_ALTER_TABLE_UPDATE_TAG_NAME:
697✔
2693
      code = mndAlterStbTagName(pMnode, pOld, &stbObj, pAlter->pFields);
697✔
2694
      updateTagIndex = true;
697✔
2695
      break;
697✔
2696
    case TSDB_ALTER_TABLE_UPDATE_TAG_BYTES:
517✔
2697
      pField0 = taosArrayGet(pAlter->pFields, 0);
517✔
2698
      code = mndAlterStbTagBytes(pMnode, pOld, &stbObj, pField0);
517✔
2699
      break;
517✔
2700
    case TSDB_ALTER_TABLE_ADD_COLUMN:
4,216✔
2701
      code = mndAddSuperTableColumn(pOld, &stbObj, pAlter, pAlter->numOfFields, 0);
4,216✔
2702
      break;
4,216✔
2703
    case TSDB_ALTER_TABLE_DROP_COLUMN:
2,174✔
2704
      pField0 = taosArrayGet(pAlter->pFields, 0);
2,174✔
2705
      code = mndDropSuperTableColumn(pMnode, pOld, &stbObj, pField0->name);
2,174✔
2706
      break;
2,174✔
2707
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES:
807✔
2708
      pField0 = taosArrayGet(pAlter->pFields, 0);
807✔
2709
      code = mndAlterStbColumnBytes(pMnode, pOld, &stbObj, pField0);
807✔
2710
      break;
807✔
2711
    case TSDB_ALTER_TABLE_UPDATE_OPTIONS:
37✔
2712
      needRsp = false;
37✔
2713
      code = mndUpdateTableOptions(pOld, &stbObj, pAlter->comment, pAlter->commentLen, pAlter->ttl, pAlter->keep);
37✔
2714
      break;
37✔
2715
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_COMPRESS:
168✔
2716
      code = mndUpdateSuperTableColumnCompress(pMnode, pOld, &stbObj, pAlter->pFields, pAlter->numOfFields);
168✔
2717
      break;
168✔
2718
    case TSDB_ALTER_TABLE_ADD_COLUMN_WITH_COMPRESS_OPTION:
460✔
2719
      code = mndAddSuperTableColumn(pOld, &stbObj, pAlter, pAlter->numOfFields, 1);
460✔
2720
      break;
460✔
2721
    default:
×
2722
      needRsp = false;
×
2723
      terrno = TSDB_CODE_OPS_NOT_SUPPORT;
×
2724
      break;
×
2725
  }
2726

2727
  if (code != 0) goto _OVER;
10,103✔
2728
  if (updateTagIndex == false) {
8,503✔
2729
    code = mndAlterStbImp(pMnode, pReq, pDb, &stbObj, needRsp, pReq->pCont, pReq->contLen);
7,505✔
2730
  } else {
2731
    code = mndAlterStbAndUpdateTagIdxImp(pMnode, pReq, pDb, &stbObj, needRsp, pReq->pCont, pReq->contLen, pAlter);
998✔
2732
  }
2733

2734
_OVER:
10,103✔
2735
  taosMemoryFreeClear(stbObj.pTags);
10,103!
2736
  taosMemoryFreeClear(stbObj.pColumns);
10,103!
2737
  taosMemoryFreeClear(stbObj.pCmpr);
10,103!
2738
  if (pAlter->commentLen > 0) {
10,103✔
2739
    taosMemoryFreeClear(stbObj.comment);
10!
2740
  }
2741
  taosMemoryFreeClear(stbObj.pExtSchemas);
10,103!
2742
  TAOS_RETURN(code);
10,103✔
2743
}
2744

2745
static int32_t mndProcessAlterStbReq(SRpcMsg *pReq) {
10,139✔
2746
  SMnode       *pMnode = pReq->info.node;
10,139✔
2747
  int32_t       code = -1;
10,139✔
2748
  SDbObj       *pDb = NULL;
10,139✔
2749
  SStbObj      *pStb = NULL;
10,139✔
2750
  SMAlterStbReq alterReq = {0};
10,139✔
2751

2752
  if (tDeserializeSMAlterStbReq(pReq->pCont, pReq->contLen, &alterReq) != 0) {
10,139!
2753
    code = TSDB_CODE_INVALID_MSG;
×
2754
    goto _OVER;
×
2755
  }
2756

2757
  mInfo("stb:%s, start to alter", alterReq.name);
10,139!
2758
  if (mndCheckAlterStbReq(&alterReq) != 0) goto _OVER;
10,139!
2759

2760
  pDb = mndAcquireDbByStb(pMnode, alterReq.name);
10,139✔
2761
  if (pDb == NULL) {
10,139✔
2762
    code = TSDB_CODE_MND_DB_NOT_EXIST;
6✔
2763
    goto _OVER;
6✔
2764
  }
2765
  if (pDb->cfg.isMount) {
10,133✔
2766
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
2✔
2767
    goto _OVER;
2✔
2768
  }
2769

2770
  pStb = mndAcquireStb(pMnode, alterReq.name);
10,131✔
2771
  if (pStb == NULL) {
10,131✔
2772
    code = TSDB_CODE_MND_STB_NOT_EXIST;
28✔
2773
    goto _OVER;
28✔
2774
  }
2775

2776
  if ((code = mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_WRITE_DB, pDb)) != 0) {
10,103!
2777
    goto _OVER;
×
2778
  }
2779

2780
  code = mndAlterStb(pMnode, pReq, &alterReq, pDb, pStb);
10,103✔
2781
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
10,103✔
2782

2783
  SName   name = {0};
10,103✔
2784
  int32_t ret = 0;
10,103✔
2785
  if ((ret = tNameFromString(&name, alterReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0)
10,103!
2786
    mError("stb:%s, failed to tNameFromString since %s", alterReq.name, tstrerror(ret));
×
2787

2788
  auditRecord(pReq, pMnode->clusterId, "alterStb", name.dbname, name.tname, alterReq.sql, alterReq.sqlLen);
10,103✔
2789

2790
_OVER:
10,139✔
2791
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
10,139!
2792
    mError("stb:%s, failed to alter since %s", alterReq.name, tstrerror(code));
1,640!
2793
  }
2794

2795
  mndReleaseStb(pMnode, pStb);
10,139✔
2796
  mndReleaseDb(pMnode, pDb);
10,139✔
2797
  tFreeSMAltertbReq(&alterReq);
10,139✔
2798

2799
  TAOS_RETURN(code);
10,139✔
2800
}
2801

2802
static int32_t mndSetDropStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SStbObj *pStb) {
1,452✔
2803
  int32_t  code = 0;
1,452✔
2804
  SSdbRaw *pRedoRaw = mndStbActionEncode(pStb);
1,452✔
2805
  if (pRedoRaw == NULL) {
1,452!
2806
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2807
    if (terrno != 0) code = terrno;
×
2808
    TAOS_RETURN(code);
×
2809
  }
2810
  if ((code = mndTransAppendPrepareLog(pTrans, pRedoRaw)) != 0) {
1,452!
2811
    sdbFreeRaw(pRedoRaw);
×
2812
    TAOS_RETURN(code);
×
2813
  }
2814
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_DROPPING));
1,452!
2815

2816
  TAOS_RETURN(code);
1,452✔
2817
}
2818

2819
static int32_t mndSetDropStbCommitLogs(SMnode *pMnode, STrans *pTrans, SStbObj *pStb) {
1,452✔
2820
  int32_t  code = 0;
1,452✔
2821
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
1,452✔
2822
  if (pCommitRaw == NULL) {
1,452!
2823
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2824
    if (terrno != 0) code = terrno;
×
2825
    TAOS_RETURN(code);
×
2826
  }
2827
  if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
1,452!
2828
    sdbFreeRaw(pCommitRaw);
×
2829
    TAOS_RETURN(code);
×
2830
  }
2831
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED));
1,452!
2832

2833
  TAOS_RETURN(code);
1,452✔
2834
}
2835

2836
static int32_t mndSetDropStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
1,452✔
2837
  int32_t code = 0;
1,452✔
2838
  SSdb   *pSdb = pMnode->pSdb;
1,452✔
2839
  SVgObj *pVgroup = NULL;
1,452✔
2840
  void   *pIter = NULL;
1,452✔
2841

2842
  while (1) {
4,664✔
2843
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
6,116✔
2844
    if (pIter == NULL) break;
6,116✔
2845
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
4,664✔
2846
      sdbRelease(pSdb, pVgroup);
1,757✔
2847
      continue;
1,757✔
2848
    }
2849

2850
    int32_t contLen = 0;
2,907✔
2851
    void   *pReq = mndBuildVDropStbReq(pMnode, pVgroup, pStb, &contLen);
2,907✔
2852
    if (pReq == NULL) {
2,907!
2853
      sdbCancelFetch(pSdb, pIter);
×
2854
      sdbRelease(pSdb, pVgroup);
×
2855
      code = TSDB_CODE_OUT_OF_MEMORY;
×
2856
      TAOS_RETURN(code);
×
2857
    }
2858

2859
    STransAction action = {0};
2,907✔
2860
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
2,907✔
2861
    action.pCont = pReq;
2,907✔
2862
    action.contLen = contLen;
2,907✔
2863
    action.msgType = TDMT_VND_DROP_STB;
2,907✔
2864
    action.acceptableCode = TSDB_CODE_TDB_STB_NOT_EXIST;
2,907✔
2865
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
2,907!
2866
      taosMemoryFree(pReq);
×
2867
      sdbCancelFetch(pSdb, pIter);
×
2868
      sdbRelease(pSdb, pVgroup);
×
2869
      TAOS_RETURN(code);
×
2870
    }
2871
    sdbRelease(pSdb, pVgroup);
2,907✔
2872
  }
2873

2874
  TAOS_RETURN(code);
1,452✔
2875
}
2876

2877
static int32_t mndDropStb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb) {
1,452✔
2878
  int32_t code = -1;
1,452✔
2879
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "drop-stb");
1,452✔
2880
  if (pTrans == NULL) {
1,452!
2881
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2882
    if (terrno != 0) code = terrno;
×
2883
    goto _OVER;
×
2884
  }
2885

2886
  mInfo("trans:%d, used to drop stb:%s", pTrans->id, pStb->name);
1,452!
2887
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
1,452✔
2888
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
1,452!
2889

2890
  TAOS_CHECK_GOTO(mndSetDropStbPrepareLogs(pMnode, pTrans, pStb), NULL, _OVER);
1,452!
2891
  TAOS_CHECK_GOTO(mndSetDropStbCommitLogs(pMnode, pTrans, pStb), NULL, _OVER);
1,452!
2892
  TAOS_CHECK_GOTO(mndSetDropStbRedoActions(pMnode, pTrans, pDb, pStb), NULL, _OVER);
1,452!
2893
  TAOS_CHECK_GOTO(mndDropIdxsByStb(pMnode, pTrans, pDb, pStb), NULL, _OVER);
1,452!
2894
  TAOS_CHECK_GOTO(mndDropRsmaByStb(pMnode, pTrans, pDb, pStb), NULL, _OVER);
1,452!
2895
  TAOS_CHECK_GOTO(mndUserRemoveStb(pMnode, pTrans, pStb->name), NULL, _OVER);
1,452!
2896
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
1,452!
2897
  code = 0;
1,452✔
2898

2899
_OVER:
1,452✔
2900
  mndTransDrop(pTrans);
1,452✔
2901
  TAOS_RETURN(code);
1,452✔
2902
}
2903

2904
static int32_t mndCheckDropStbForTopic(SMnode *pMnode, const char *stbFullName, int64_t suid) {
1,454✔
2905
  int32_t code = 0;
1,454✔
2906
  SSdb   *pSdb = pMnode->pSdb;
1,454✔
2907
  void   *pIter = NULL;
1,454✔
2908
  while (1) {
79✔
2909
    SMqTopicObj *pTopic = NULL;
1,533✔
2910
    pIter = sdbFetch(pSdb, SDB_TOPIC, pIter, (void **)&pTopic);
1,533✔
2911
    if (pIter == NULL) break;
1,533✔
2912

2913
    if (pTopic->subType == TOPIC_SUB_TYPE__TABLE) {
79✔
2914
      if (pTopic->stbUid == suid) {
14!
2915
        sdbRelease(pSdb, pTopic);
×
2916
        sdbCancelFetch(pSdb, pIter);
×
2917
        TAOS_RETURN(-1);
×
2918
      }
2919
    }
2920

2921
    if (pTopic->ast == NULL) {
79✔
2922
      sdbRelease(pSdb, pTopic);
37✔
2923
      continue;
37✔
2924
    }
2925

2926
    SNode *pAst = NULL;
42✔
2927
    if (nodesStringToNode(pTopic->ast, &pAst) != 0) {
42!
2928
      code = TSDB_CODE_MND_INVALID_TOPIC_OPTION;
×
2929
      mError("topic:%s, create ast error", pTopic->name);
×
2930
      sdbRelease(pSdb, pTopic);
×
2931
      sdbCancelFetch(pSdb, pIter);
×
2932
      TAOS_RETURN(code);
×
2933
    }
2934

2935
    SNodeList *pNodeList = NULL;
42✔
2936
    if ((code = nodesCollectColumns((SSelectStmt *)pAst, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pNodeList)) !=
42!
2937
        0) {
2938
      sdbRelease(pSdb, pTopic);
×
2939
      sdbCancelFetch(pSdb, pIter);
×
2940
      TAOS_RETURN(code);
×
2941
    }
2942
    SNode *pNode = NULL;
42✔
2943
    FOREACH(pNode, pNodeList) {
42✔
2944
      SColumnNode *pCol = (SColumnNode *)pNode;
28✔
2945

2946
      if (pCol->tableId == suid) {
28!
2947
        sdbRelease(pSdb, pTopic);
×
2948
        nodesDestroyNode(pAst);
×
2949
        nodesDestroyList(pNodeList);
×
2950
        sdbCancelFetch(pSdb, pIter);
×
2951
        TAOS_RETURN(-1);
×
2952
      } else {
2953
        goto NEXT;
28✔
2954
      }
2955
    }
2956
  NEXT:
14✔
2957
    sdbRelease(pSdb, pTopic);
42✔
2958
    nodesDestroyNode(pAst);
42✔
2959
    nodesDestroyList(pNodeList);
42✔
2960
  }
2961
  TAOS_RETURN(code);
1,454✔
2962
}
2963

2964
static int32_t mndCheckDropStbForStream(SMnode *pMnode, const char *stbFullName, int64_t suid) {
×
2965
  int32_t code = 0;
×
2966
  SSdb   *pSdb = pMnode->pSdb;
×
2967
  void   *pIter = NULL;
×
2968
  while (1) {
×
2969
    SStreamObj *pStream = NULL;
×
2970
    pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
×
2971
    if (pIter == NULL) break;
×
2972

2973
    if (pStream->pCreate->outStbUid == suid) {
×
2974
      sdbCancelFetch(pSdb, pIter);
×
2975
      sdbRelease(pSdb, pStream);
×
2976
      TAOS_RETURN(-1);
×
2977
    }
2978

2979
    sdbRelease(pSdb, pStream);
×
2980
  }
2981
  TAOS_RETURN(code);
×
2982
}
2983

2984
static int32_t mndProcessDropTtltbRsp(SRpcMsg *pRsp) { return 0; }
×
2985

2986
static int32_t mndProcessDropStbReq(SRpcMsg *pReq) {
2,174✔
2987
  SMnode      *pMnode = pReq->info.node;
2,174✔
2988
  int32_t      code = -1;
2,174✔
2989
  SDbObj      *pDb = NULL;
2,174✔
2990
  SStbObj     *pStb = NULL;
2,174✔
2991
  SMDropStbReq dropReq = {0};
2,174✔
2992

2993
  TAOS_CHECK_GOTO(tDeserializeSMDropStbReq(pReq->pCont, pReq->contLen, &dropReq), NULL, _OVER);
2,174!
2994

2995
  mInfo("stb:%s, start to drop", dropReq.name);
2,174!
2996

2997
  pStb = mndAcquireStb(pMnode, dropReq.name);
2,174✔
2998
  if (pStb == NULL) {
2,174✔
2999
    if (dropReq.igNotExists) {
720✔
3000
      mInfo("stb:%s, not exist, ignore not exist is set", dropReq.name);
714!
3001
      code = 0;
714✔
3002
      goto _OVER;
714✔
3003
    } else {
3004
      code = TSDB_CODE_MND_STB_NOT_EXIST;
6✔
3005
      goto _OVER;
6✔
3006
    }
3007
  }
3008

3009
  if ((dropReq.source == TD_REQ_FROM_TAOX_OLD || dropReq.source == TD_REQ_FROM_TAOX) && pStb->uid != dropReq.suid) {
1,454!
3010
    code = 0;
×
3011
    goto _OVER;
×
3012
  }
3013

3014
  pDb = mndAcquireDbByStb(pMnode, dropReq.name);
1,454✔
3015
  if (pDb == NULL) {
1,454!
3016
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
3017
    goto _OVER;
×
3018
  }
3019

3020
  if ((code = mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_WRITE_DB, pDb)) != 0) {
1,454!
3021
    goto _OVER;
×
3022
  }
3023

3024
  if (mndCheckDropStbForTopic(pMnode, dropReq.name, pStb->uid) < 0) {
1,454!
3025
    code = TSDB_CODE_MND_TOPIC_MUST_BE_DELETED;
×
3026
    goto _OVER;
×
3027
  }
3028

3029
/*
3030
  if (mndCheckDropStbForStream(pMnode, dropReq.name, pStb->uid) < 0) {
3031
    code = TSDB_CODE_MND_STREAM_MUST_BE_DELETED;
3032
    goto _OVER;
3033
  }
3034
*/
3035

3036
  if (pDb->cfg.isMount) {
1,454✔
3037
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
2✔
3038
    goto _OVER;
2✔
3039
  }
3040

3041
  code = mndDropStb(pMnode, pReq, pDb, pStb);
1,452✔
3042
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
1,452!
3043

3044
  SName   name = {0};
1,452✔
3045
  int32_t ret = 0;
1,452✔
3046
  if ((ret = tNameFromString(&name, dropReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0)
1,452!
3047
    mError("stb:%s, failed to tNameFromString since %s", dropReq.name, tstrerror(ret));
×
3048

3049
  auditRecord(pReq, pMnode->clusterId, "dropStb", name.dbname, name.tname, dropReq.sql, dropReq.sqlLen);
1,452✔
3050

3051
_OVER:
2,174✔
3052
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
2,174✔
3053
    mError("stb:%s, failed to drop since %s", dropReq.name, tstrerror(code));
8!
3054
  }
3055

3056
  mndReleaseDb(pMnode, pDb);
2,174✔
3057
  mndReleaseStb(pMnode, pStb);
2,174✔
3058
  tFreeSMDropStbReq(&dropReq);
2,174✔
3059
  TAOS_RETURN(code);
2,174✔
3060
}
3061

3062
static int32_t mndProcessTableMetaReq(SRpcMsg *pReq) {
2,216,100✔
3063
  SMnode       *pMnode = pReq->info.node;
2,216,100✔
3064
  int32_t       code = -1;
2,216,100✔
3065
  STableInfoReq infoReq = {0};
2,216,100✔
3066
  STableMetaRsp metaRsp = {0};
2,216,100✔
3067
  SUserObj     *pUser = NULL;
2,216,100✔
3068

3069
  code = mndAcquireUser(pMnode, pReq->info.conn.user, &pUser);
2,216,100✔
3070
  if (pUser == NULL) return 0;
2,216,914!
3071
  bool sysinfo = pUser->sysInfo;
2,216,914✔
3072

3073
  TAOS_CHECK_GOTO(tDeserializeSTableInfoReq(pReq->pCont, pReq->contLen, &infoReq), NULL, _OVER);
2,216,914!
3074

3075
  if (0 == strcmp(infoReq.dbFName, TSDB_INFORMATION_SCHEMA_DB)) {
2,216,977✔
3076
    mInfo("information_schema table:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
217,360!
3077
    TAOS_CHECK_GOTO(mndBuildInsTableSchema(pMnode, infoReq.dbFName, infoReq.tbName, sysinfo, &metaRsp), NULL, _OVER);
217,360✔
3078
  } else if (0 == strcmp(infoReq.dbFName, TSDB_PERFORMANCE_SCHEMA_DB)) {
1,999,617✔
3079
    mInfo("performance_schema table:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
54,420!
3080
    TAOS_CHECK_GOTO(mndBuildPerfsTableSchema(pMnode, infoReq.dbFName, infoReq.tbName, &metaRsp), NULL, _OVER);
54,420✔
3081
  } else {
3082
    mInfo("stb:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
1,945,197✔
3083
    TAOS_CHECK_GOTO(mndBuildStbSchema(pMnode, infoReq.dbFName, infoReq.tbName, &metaRsp, true), NULL, _OVER);
1,945,731✔
3084
  }
3085

3086
  int32_t rspLen = tSerializeSTableMetaRsp(NULL, 0, &metaRsp);
2,213,701✔
3087
  if (rspLen < 0) {
2,213,210!
3088
    code = TSDB_CODE_INVALID_MSG;
×
3089
    goto _OVER;
×
3090
  }
3091

3092
  void *pRsp = rpcMallocCont(rspLen);
2,213,210✔
3093
  if (pRsp == NULL) {
2,213,064!
3094
    code = terrno;
×
3095
    goto _OVER;
×
3096
  }
3097

3098
  if ((rspLen = tSerializeSTableMetaRsp(pRsp, rspLen, &metaRsp)) < 0) {
2,213,064!
3099
    code = rspLen;
×
3100
    goto _OVER;
×
3101
  }
3102
  pReq->info.rsp = pRsp;
2,213,164✔
3103
  pReq->info.rspLen = rspLen;
2,213,164✔
3104
  code = 0;
2,213,164✔
3105

3106
  mTrace("%s.%s, meta is retrieved", infoReq.dbFName, infoReq.tbName);
2,213,164✔
3107

3108
_OVER:
2,213,151✔
3109
  if (code != 0) {
2,216,581✔
3110
    mError("stb:%s.%s, failed to retrieve meta since %s", infoReq.dbFName, infoReq.tbName, tstrerror(code));
3,417!
3111
  }
3112

3113
  mndReleaseUser(pMnode, pUser);
2,216,581✔
3114
  tFreeSTableMetaRsp(&metaRsp);
2,217,093✔
3115
  // TODO change to TAOS_RETURN
3116
  return code;
2,217,051✔
3117
}
3118

3119
static int32_t mndProcessTableCfgReq(SRpcMsg *pReq) {
130✔
3120
  SMnode      *pMnode = pReq->info.node;
130✔
3121
  int32_t      code = -1;
130✔
3122
  STableCfgReq cfgReq = {0};
130✔
3123
  STableCfgRsp cfgRsp = {0};
130✔
3124

3125
  TAOS_CHECK_GOTO(tDeserializeSTableCfgReq(pReq->pCont, pReq->contLen, &cfgReq), NULL, _OVER);
130!
3126

3127
  char dbName[TSDB_DB_NAME_LEN] = {0};
130✔
3128
  TAOS_CHECK_GOTO(mndExtractShortDbNameFromDbFullName(cfgReq.dbFName, dbName), NULL, _OVER);
130!
3129
  if (0 == strcmp(dbName, TSDB_INFORMATION_SCHEMA_DB)) {
130✔
3130
    mInfo("information_schema table:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
20!
3131
    TAOS_CHECK_GOTO(mndBuildInsTableCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
20!
3132
  } else if (0 == strcmp(dbName, TSDB_PERFORMANCE_SCHEMA_DB)) {
110✔
3133
    mInfo("performance_schema table:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
10!
3134
    TAOS_CHECK_GOTO(mndBuildPerfsTableCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
10!
3135
  } else {
3136
    mInfo("stb:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
100!
3137
    TAOS_CHECK_GOTO(mndBuildStbCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
100!
3138
  }
3139

3140
  int32_t rspLen = tSerializeSTableCfgRsp(NULL, 0, &cfgRsp);
130✔
3141
  if (rspLen < 0) {
130!
3142
    code = TSDB_CODE_INVALID_MSG;
×
3143
    goto _OVER;
×
3144
  }
3145

3146
  void *pRsp = rpcMallocCont(rspLen);
130✔
3147
  if (pRsp == NULL) {
130!
3148
    code = terrno;
×
3149
    goto _OVER;
×
3150
  }
3151

3152
  if ((rspLen = tSerializeSTableCfgRsp(pRsp, rspLen, &cfgRsp)) < 0) {
130!
3153
    code = rspLen;
×
3154
    goto _OVER;
×
3155
  }
3156
  pReq->info.rsp = pRsp;
130✔
3157
  pReq->info.rspLen = rspLen;
130✔
3158
  code = 0;
130✔
3159

3160
  mTrace("%s.%s, cfg is retrieved", cfgReq.dbFName, cfgReq.tbName);
130!
3161

3162
_OVER:
130✔
3163
  if (code != 0) {
130!
3164
    mError("stb:%s.%s, failed to retrieve cfg since %s", cfgReq.dbFName, cfgReq.tbName, tstrerror(code));
×
3165
  }
3166

3167
  tFreeSTableCfgRsp(&cfgRsp);
130✔
3168
  TAOS_RETURN(code);
130✔
3169
}
3170

3171
int32_t mndValidateStbInfo(SMnode *pMnode, SSTableVersion *pStbVersions, int32_t numOfStbs, void **ppRsp,
25,367✔
3172
                           int32_t *pRspLen) {
3173
  int32_t   code = 0;
25,367✔
3174
  SSTbHbRsp hbRsp = {0};
25,367✔
3175
  hbRsp.pMetaRsp = taosArrayInit(numOfStbs, sizeof(STableMetaRsp));
25,367✔
3176
  if (hbRsp.pMetaRsp == NULL) {
25,367!
3177
    code = terrno;
×
3178
    TAOS_RETURN(code);
×
3179
  }
3180

3181
  hbRsp.pIndexRsp = taosArrayInit(numOfStbs, sizeof(STableIndexRsp));
25,367✔
3182
  if (NULL == hbRsp.pIndexRsp) {
25,367!
3183
    taosArrayDestroy(hbRsp.pMetaRsp);
×
3184
    code = terrno;
×
3185
    TAOS_RETURN(code);
×
3186
  }
3187

3188
  for (int32_t i = 0; i < numOfStbs; ++i) {
62,879✔
3189
    SSTableVersion *pStbVersion = &pStbVersions[i];
37,512✔
3190
    pStbVersion->suid = be64toh(pStbVersion->suid);
37,512✔
3191
    pStbVersion->sversion = ntohl(pStbVersion->sversion);
37,512✔
3192
    pStbVersion->tversion = ntohl(pStbVersion->tversion);
37,512✔
3193
    pStbVersion->smaVer = ntohl(pStbVersion->smaVer);
37,512✔
3194

3195
    bool    schema = false;
37,512✔
3196
    bool    sma = false;
37,512✔
3197
    int32_t code = mndValidateStbVersion(pMnode, pStbVersion, &schema, &sma);
37,512✔
3198
    if (TSDB_CODE_SUCCESS != code) {
37,512✔
3199
      STableMetaRsp metaRsp = {0};
130✔
3200
      metaRsp.numOfColumns = -1;
130✔
3201
      metaRsp.suid = pStbVersion->suid;
130✔
3202
      tstrncpy(metaRsp.dbFName, pStbVersion->dbFName, sizeof(metaRsp.dbFName));
130✔
3203
      tstrncpy(metaRsp.tbName, pStbVersion->stbName, sizeof(metaRsp.tbName));
130✔
3204
      tstrncpy(metaRsp.stbName, pStbVersion->stbName, sizeof(metaRsp.stbName));
130✔
3205
      if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
260!
3206
        code = terrno;
×
3207
        return code;
×
3208
      }
3209
      continue;
130✔
3210
    }
3211

3212
    if (schema) {
37,382✔
3213
      STableMetaRsp metaRsp = {0};
316✔
3214
      mInfo("stb:%s.%s, start to retrieve meta", pStbVersion->dbFName, pStbVersion->stbName);
316!
3215
      if (mndBuildStbSchema(pMnode, pStbVersion->dbFName, pStbVersion->stbName, &metaRsp, false) != 0) {
316!
3216
        metaRsp.numOfColumns = -1;
×
3217
        metaRsp.suid = pStbVersion->suid;
×
3218
        tstrncpy(metaRsp.dbFName, pStbVersion->dbFName, sizeof(metaRsp.dbFName));
×
3219
        tstrncpy(metaRsp.tbName, pStbVersion->stbName, sizeof(metaRsp.tbName));
×
3220
        tstrncpy(metaRsp.stbName, pStbVersion->stbName, sizeof(metaRsp.stbName));
×
3221
        if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
×
3222
          code = terrno;
×
3223
          return code;
×
3224
        }
3225
        continue;
×
3226
      }
3227

3228
      if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
632!
3229
        code = terrno;
×
3230
        return code;
×
3231
      }
3232
    }
3233

3234
    if (sma) {
37,382!
3235
      bool           exist = false;
×
3236
      char           tbFName[TSDB_TABLE_FNAME_LEN];
3237
      STableIndexRsp indexRsp = {0};
×
3238
      indexRsp.pIndex = taosArrayInit(10, sizeof(STableIndexInfo));
×
3239
      if (NULL == indexRsp.pIndex) {
×
3240
        code = terrno;
×
3241
        TAOS_RETURN(code);
×
3242
      }
3243

3244
      (void)tsnprintf(tbFName, sizeof(tbFName), "%s.%s", pStbVersion->dbFName, pStbVersion->stbName);
×
3245
      tstrncpy(indexRsp.dbFName, pStbVersion->dbFName, sizeof(indexRsp.dbFName));
×
3246
      tstrncpy(indexRsp.tbName, pStbVersion->stbName, sizeof(indexRsp.tbName));
×
3247

3248
      if (taosArrayPush(hbRsp.pIndexRsp, &indexRsp) == NULL) {
×
3249
        code = terrno;
×
3250
        return code;
×
3251
      }
3252
    }
3253
  }
3254

3255
  int32_t rspLen = tSerializeSSTbHbRsp(NULL, 0, &hbRsp);
25,367✔
3256
  if (rspLen < 0) {
25,367!
3257
    tFreeSSTbHbRsp(&hbRsp);
×
3258
    code = TSDB_CODE_INVALID_MSG;
×
3259
    TAOS_RETURN(code);
×
3260
  }
3261

3262
  void *pRsp = taosMemoryMalloc(rspLen);
25,367!
3263
  if (pRsp == NULL) {
25,367!
3264
    tFreeSSTbHbRsp(&hbRsp);
×
3265
    code = terrno;
×
3266
    TAOS_RETURN(code);
×
3267
  }
3268

3269
  rspLen = tSerializeSSTbHbRsp(pRsp, rspLen, &hbRsp);
25,367✔
3270
  tFreeSSTbHbRsp(&hbRsp);
25,367✔
3271
  if (rspLen < 0) return rspLen;
25,367!
3272
  *ppRsp = pRsp;
25,367✔
3273
  *pRspLen = rspLen;
25,367✔
3274
  TAOS_RETURN(code);
25,367✔
3275
}
3276

3277
int32_t mndGetNumOfStbs(SMnode *pMnode, char *dbName, int32_t *pNumOfStbs) {
6,682✔
3278
  int32_t code = 0;
6,682✔
3279
  SSdb   *pSdb = pMnode->pSdb;
6,682✔
3280
  SDbObj *pDb = mndAcquireDb(pMnode, dbName);
6,682✔
3281
  if (pDb == NULL) {
6,682!
3282
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
3283
    TAOS_RETURN(code);
×
3284
  }
3285

3286
  int32_t numOfStbs = 0;
6,682✔
3287
  void   *pIter = NULL;
6,682✔
3288
  while (1) {
257,888✔
3289
    SStbObj *pStb = NULL;
264,570✔
3290
    pIter = sdbFetch(pSdb, SDB_STB, pIter, (void **)&pStb);
264,570✔
3291
    if (pIter == NULL) break;
264,570✔
3292

3293
    if (pStb->dbUid == pDb->uid) {
257,888✔
3294
      numOfStbs++;
130,378✔
3295
    }
3296

3297
    sdbRelease(pSdb, pStb);
257,888✔
3298
  }
3299

3300
  *pNumOfStbs = numOfStbs;
6,682✔
3301
  mndReleaseDb(pMnode, pDb);
6,682✔
3302
  TAOS_RETURN(code);
6,682✔
3303
}
3304

3305
int32_t mndExtractDbNameFromStbFullName(const char *stbFullName, char *dst) {
×
3306
  SName name = {0};
×
3307
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
×
3308

3309
  TAOS_CHECK_RETURN(tNameGetFullDbName(&name, dst));
×
3310

3311
  return 0;
×
3312
}
3313

3314
int32_t mndExtractShortDbNameFromStbFullName(const char *stbFullName, char *dst) {
94✔
3315
  SName name = {0};
94✔
3316
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
94!
3317

3318
  TAOS_CHECK_RETURN(tNameGetDbName(&name, dst));
94!
3319

3320
  return 0;
94✔
3321
}
3322

3323
int32_t mndExtractShortDbNameFromDbFullName(const char *stbFullName, char *dst) {
130✔
3324
  SName name = {0};
130✔
3325
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB));
130!
3326

3327
  TAOS_CHECK_RETURN(tNameGetDbName(&name, dst));
130!
3328

3329
  return 0;
130✔
3330
}
3331

3332
void mndExtractTbNameFromStbFullName(const char *stbFullName, char *dst, int32_t dstSize) {
1,724,631✔
3333
  int32_t pos = -1;
1,724,631✔
3334
  int32_t num = 0;
1,724,631✔
3335
  for (pos = 0; stbFullName[pos] != 0; ++pos) {
29,768,913✔
3336
    if (stbFullName[pos] == TS_PATH_DELIMITER[0]) num++;
29,768,891✔
3337
    if (num == 2) break;
29,768,891✔
3338
  }
3339

3340
  if (num == 2) {
1,724,631✔
3341
    tstrncpy(dst, stbFullName + pos + 1, dstSize);
1,724,606✔
3342
  }
3343
}
1,724,631✔
3344

3345
static int32_t mndRetrieveStb(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
18,017✔
3346
  SMnode   *pMnode = pReq->info.node;
18,017✔
3347
  SSdb     *pSdb = pMnode->pSdb;
18,017✔
3348
  int32_t   numOfRows = 0;
18,017✔
3349
  SStbObj  *pStb = NULL;
18,017✔
3350
  SUserObj *pUser = NULL;
18,017✔
3351
  int32_t   cols = 0;
18,017✔
3352
  int32_t   lino = 0;
18,017✔
3353
  int32_t   code = 0;
18,017✔
3354

3355
  SDbObj *pDb = NULL;
18,017✔
3356
  if (strlen(pShow->db) > 0) {
18,017✔
3357
    pDb = mndAcquireDb(pMnode, pShow->db);
746✔
3358
    if (pDb == NULL) return terrno;
746✔
3359
  }
3360

3361
  if ((code = mndAcquireUser(pMnode, pReq->info.conn.user, &pUser)) != 0) {
18,014!
3362
    goto _ERROR;
×
3363
  }
3364

3365
  while (numOfRows < rows) {
952,175✔
3366
    pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb);
944,399✔
3367
    if (pShow->pIter == NULL) break;
944,012✔
3368

3369
    if (pDb != NULL && pStb->dbUid != pDb->uid) {
933,737✔
3370
      sdbRelease(pSdb, pStb);
2,605✔
3371
      continue;
2,616✔
3372
    }
3373

3374
    if (isTsmaResSTb(pStb->name)) {
931,132!
3375
      sdbRelease(pSdb, pStb);
×
3376
      continue;
×
3377
    }
3378

3379
    if ((0 == pUser->superUser) && mndCheckStbPrivilege(pMnode, pUser, MND_OPER_SHOW_STB, pStb) != 0) {
931,093✔
3380
      sdbRelease(pSdb, pStb);
11✔
3381
      terrno = 0;
11✔
3382
      continue;
11✔
3383
    }
3384

3385
    cols = 0;
931,082✔
3386

3387
    SName name = {0};
931,082✔
3388

3389
    char stbName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
931,082✔
3390
    mndExtractTbNameFromStbFullName(pStb->name, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN);
931,082✔
3391
    varDataSetLen(stbName, strlen(&stbName[VARSTR_HEADER_SIZE]));
931,394✔
3392
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
931,394✔
3393
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stbName, false), pStb, &lino, _ERROR);
929,179!
3394

3395
    char db[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
925,406✔
3396
    RETRIEVE_CHECK_GOTO(tNameFromString(&name, pStb->db, T_NAME_ACCT | T_NAME_DB), pStb, &lino, _ERROR);
925,406!
3397
    RETRIEVE_CHECK_GOTO(tNameGetDbName(&name, varDataVal(db)), pStb, &lino, _ERROR);
930,503!
3398
    varDataSetLen(db, strlen(varDataVal(db)));
930,520✔
3399
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
930,520✔
3400
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)db, false), pStb, &lino, _ERROR);
928,150!
3401

3402
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
923,448✔
3403
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->createdTime, false), pStb, &lino,
921,515!
3404
                        _ERROR);
3405

3406
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
920,110✔
3407
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->numOfColumns, false), pStb, &lino,
918,496!
3408
                        _ERROR);
3409

3410
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
919,051✔
3411
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->numOfTags, false), pStb, &lino, _ERROR);
917,403!
3412

3413
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
917,924✔
3414
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->updateTime, false), pStb, &lino,
916,427!
3415
                        _ERROR);  // number of tables
3416

3417
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
918,860✔
3418
    if (pStb->commentLen > 0) {
917,099!
3419
      char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
×
3420
      STR_TO_VARSTR(comment, pStb->comment);
×
3421
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, comment, false), pStb, &lino, _ERROR);
×
3422
    } else if (pStb->commentLen == 0) {
917,100✔
3423
      char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
459✔
3424
      STR_TO_VARSTR(comment, "");
459✔
3425
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, comment, false), pStb, &lino, _ERROR);
459!
3426
    } else {
3427
      colDataSetNULL(pColInfo, numOfRows);
916,641!
3428
    }
3429

3430
    char watermark[64 + VARSTR_HEADER_SIZE] = {0};
917,129✔
3431
    (void)tsnprintf(varDataVal(watermark), sizeof(watermark) - VARSTR_HEADER_SIZE, "%" PRId64 "a,%" PRId64 "a",
917,129✔
3432
              pStb->watermark[0], pStb->watermark[1]);
917,129✔
3433
    varDataSetLen(watermark, strlen(varDataVal(watermark)));
931,012✔
3434

3435
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
931,012✔
3436
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)watermark, false), pStb, &lino, _ERROR);
926,571!
3437

3438
    char maxDelay[64 + VARSTR_HEADER_SIZE] = {0};
922,058✔
3439
    (void)tsnprintf(varDataVal(maxDelay), sizeof(maxDelay) - VARSTR_HEADER_SIZE, "%" PRId64 "a,%" PRId64 "a",
922,058✔
3440
              pStb->maxdelay[0], pStb->maxdelay[1]);
922,058✔
3441
    varDataSetLen(maxDelay, strlen(varDataVal(maxDelay)));
930,295✔
3442

3443
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
930,295✔
3444
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)maxDelay, false), pStb, &lino, _ERROR);
926,221!
3445

3446
    char    rollup[160 + VARSTR_HEADER_SIZE] = {0};
921,680✔
3447
    int32_t rollupNum = (int32_t)taosArrayGetSize(pStb->pFuncs);
921,680✔
3448
    char   *sep = ", ";
925,877✔
3449
    int32_t sepLen = strlen(sep);
925,877✔
3450
    int32_t rollupLen = sizeof(rollup) - VARSTR_HEADER_SIZE - 2;
925,877✔
3451
    for (int32_t i = 0; i < rollupNum; ++i) {
925,877!
3452
      char *funcName = taosArrayGet(pStb->pFuncs, i);
×
3453
      if (i) {
×
3454
        (void)strncat(varDataVal(rollup), sep, rollupLen);
×
3455
        rollupLen -= sepLen;
×
3456
      }
3457
      (void)strncat(varDataVal(rollup), funcName, rollupLen);
×
3458
      rollupLen -= strlen(funcName);
×
3459
    }
3460
    varDataSetLen(rollup, strlen(varDataVal(rollup)));
925,877✔
3461

3462
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
925,877✔
3463
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)rollup, false), pStb, &lino, _ERROR);
926,107!
3464

3465
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
920,054✔
3466
    if (pColInfo) {
917,501!
3467
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->uid), false), pStb, &lino, _ERROR);
917,554!
3468
    }
3469

3470
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
915,543✔
3471
    if (pColInfo) {
913,850✔
3472
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->virtualStb), false), pStb, &lino, _ERROR);
913,849!
3473
    }
3474

3475
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
915,209✔
3476
    if (pColInfo) {
913,545!
3477
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->keep), false), pStb, &lino, _ERROR);
913,576!
3478
    }
3479

3480
    numOfRows++;
916,434✔
3481
    sdbRelease(pSdb, pStb);
916,434✔
3482
  }
3483

3484
  if (pDb != NULL) {
18,051✔
3485
    mndReleaseDb(pMnode, pDb);
743✔
3486
  }
3487
  if (pUser != NULL) {
18,051✔
3488
    mndReleaseUser(pMnode, pUser);
18,019✔
3489
  }
3490

3491
  goto _OVER;
18,020✔
3492

3493
_ERROR:
×
3494
  if (pDb != NULL) {
×
3495
    mndReleaseDb(pMnode, pDb);
×
3496
  }
3497
  if (pUser != NULL) {
×
3498
    mndReleaseUser(pMnode, pUser);
×
3499
  }
3500
  mError("show:0x%" PRIx64 ", failed to retrieve data at %s:%d since %s", pShow->id, __FUNCTION__, lino,
×
3501
         tstrerror(code));
3502

3503
_OVER:
×
3504
  pShow->numOfRows += numOfRows;
18,020✔
3505
  return numOfRows;
18,020✔
3506
}
3507

3508
static int32_t buildDbColsInfoBlock(const SSDataBlock *p, const SSysTableMeta *pSysDbTableMeta, size_t size,
20,050✔
3509
                                    const char *dbName, const char *tbName) {
3510
  char    tName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
20,050✔
3511
  char    dName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
20,050✔
3512
  char    typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
20,050✔
3513
  int32_t numOfRows = p->info.rows;
20,050✔
3514
  int32_t lino = 0;
20,050✔
3515
  int32_t code = 0;
20,050✔
3516

3517
  STR_TO_VARSTR(dName, dbName);
20,050✔
3518
  STR_TO_VARSTR(typeName, "SYSTEM_TABLE");
20,050✔
3519

3520
  for (int32_t i = 0; i < size; ++i) {
484,058!
3521
    const SSysTableMeta *pm = &pSysDbTableMeta[i];
531,254✔
3522
    //    if (pm->sysInfo) {
3523
    //      continue;
3524
    //    }
3525
    if (tbName[0] && strncmp(tbName, pm->name, TSDB_TABLE_NAME_LEN) != 0) {
531,254!
3526
      continue;
×
3527
    }
3528

3529
    STR_TO_VARSTR(tName, pm->name);
531,254✔
3530

3531
    for (int32_t j = 0; j < pm->colNum; j++) {
4,871,344✔
3532
      // table name
3533
      SColumnInfoData *pColInfoData = taosArrayGet(p->pDataBlock, 0);
4,407,336✔
3534
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, tName, false), &lino, _OVER);
4,400,241!
3535

3536
      // database name
3537
      pColInfoData = taosArrayGet(p->pDataBlock, 1);
4,363,345✔
3538
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, dName, false), &lino, _OVER);
4,357,185!
3539

3540
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
4,359,920✔
3541
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, typeName, false), &lino, _OVER);
4,354,534!
3542

3543
      // col name
3544
      char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
4,361,101✔
3545
      STR_TO_VARSTR(colName, pm->schema[j].name);
4,361,101✔
3546
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
4,361,101✔
3547
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, colName, false), &lino, _OVER);
4,396,176!
3548

3549
      // col type
3550
      int8_t colType = pm->schema[j].type;
4,363,925✔
3551
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
4,363,925✔
3552
      char colTypeStr[VARSTR_HEADER_SIZE + 32];
3553
      int  colTypeLen =
4,420,010✔
3554
          tsnprintf(varDataVal(colTypeStr), sizeof(colTypeStr) - VARSTR_HEADER_SIZE, "%s", tDataTypes[colType].name);
4,359,692✔
3555
      if (colType == TSDB_DATA_TYPE_VARCHAR) {
4,420,010✔
3556
        colTypeLen +=
2,235,172✔
3557
            tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d)",
2,235,048✔
3558
                      (int32_t)(pm->schema[j].bytes - VARSTR_HEADER_SIZE));
2,235,048✔
3559
      } else if (colType == TSDB_DATA_TYPE_NCHAR) {
2,184,962!
3560
        colTypeLen +=
×
3561
            tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d)",
×
3562
                      (int32_t)((pm->schema[j].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
×
3563
      }
3564
      varDataSetLen(colTypeStr, colTypeLen);
4,420,134✔
3565
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, (char *)colTypeStr, false), &lino, _OVER);
4,420,134!
3566

3567
      // col length
3568
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
4,366,173✔
3569
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, (const char *)&pm->schema[j].bytes, false), &lino, _OVER);
4,360,488!
3570

3571
      // col precision, col scale, col nullable, col source
3572
      for (int32_t k = 6; k <= 10; ++k) {
25,953,223✔
3573
        pColInfoData = taosArrayGet(p->pDataBlock, k);
21,613,133✔
3574
        colDataSetNULL(pColInfoData, numOfRows);
21,598,070✔
3575
      }
3576

3577
      numOfRows += 1;
4,340,090✔
3578
    }
3579
  }
3580
  return numOfRows;
×
3581
_OVER:
×
3582
  mError("failed at %s:%d since %s", __FUNCTION__, lino, tstrerror(code));
×
3583
  return numOfRows;
×
3584
}
3585
#define BUILD_COL_FOR_INFO_DB 1
3586
#define BUILD_COL_FOR_PERF_DB 1 << 1
3587
#define BUILD_COL_FOR_USER_DB 1 << 2
3588
#define BUILD_COL_FOR_ALL_DB  (BUILD_COL_FOR_INFO_DB | BUILD_COL_FOR_PERF_DB | BUILD_COL_FOR_USER_DB)
3589

3590
static int32_t buildSysDbColsInfo(SSDataBlock *p, int8_t buildWhichDBs, char *tb) {
10,079✔
3591
  size_t               size = 0;
10,079✔
3592
  const SSysTableMeta *pSysDbTableMeta = NULL;
10,079✔
3593

3594
  if (buildWhichDBs & BUILD_COL_FOR_INFO_DB) {
10,079✔
3595
    getInfosDbMeta(&pSysDbTableMeta, &size);
10,025✔
3596
    p->info.rows = buildDbColsInfoBlock(p, pSysDbTableMeta, size, TSDB_INFORMATION_SCHEMA_DB, tb);
10,025✔
3597
  }
3598

3599
  if (buildWhichDBs & BUILD_COL_FOR_PERF_DB) {
10,079✔
3600
    getPerfDbMeta(&pSysDbTableMeta, &size);
10,025✔
3601
    p->info.rows = buildDbColsInfoBlock(p, pSysDbTableMeta, size, TSDB_PERFORMANCE_SCHEMA_DB, tb);
10,025✔
3602
  }
3603

3604
  return p->info.rows;
10,079✔
3605
}
3606

3607
static int8_t determineBuildColForWhichDBs(const char *db) {
10,103✔
3608
  int8_t buildWhichDBs;
3609
  if (!db[0])
10,103✔
3610
    buildWhichDBs = BUILD_COL_FOR_ALL_DB;
10,024✔
3611
  else {
3612
    char *p = strchr(db, '.');
79✔
3613
    if (p && strcmp(p + 1, TSDB_INFORMATION_SCHEMA_DB) == 0) {
79!
3614
      buildWhichDBs = BUILD_COL_FOR_INFO_DB;
1✔
3615
    } else if (p && strcmp(p + 1, TSDB_PERFORMANCE_SCHEMA_DB) == 0) {
78!
3616
      buildWhichDBs = BUILD_COL_FOR_PERF_DB;
1✔
3617
    } else {
3618
      buildWhichDBs = BUILD_COL_FOR_USER_DB;
77✔
3619
    }
3620
  }
3621
  return buildWhichDBs;
10,103✔
3622
}
3623

3624
static int32_t mndRetrieveStbCol(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
10,103✔
3625
  uint8_t  buildWhichDBs;
3626
  SMnode  *pMnode = pReq->info.node;
10,103✔
3627
  SSdb    *pSdb = pMnode->pSdb;
10,103✔
3628
  SStbObj *pStb = NULL;
10,103✔
3629
  int32_t  numOfRows = 0;
10,103✔
3630
  int32_t  lino = 0;
10,103✔
3631
  int32_t  code = 0;
10,103✔
3632

3633
  buildWhichDBs = determineBuildColForWhichDBs(pShow->db);
10,103✔
3634

3635
  if (!pShow->sysDbRsp) {
10,103✔
3636
    numOfRows = buildSysDbColsInfo(pBlock, buildWhichDBs, pShow->filterTb);
10,079✔
3637
    mDebug("mndRetrieveStbCol get system table cols, rows:%d, db:%s", numOfRows, pShow->db);
10,079✔
3638
    pShow->sysDbRsp = true;
10,079✔
3639
  }
3640

3641
  if (buildWhichDBs & BUILD_COL_FOR_USER_DB) {
10,103✔
3642
    SDbObj *pDb = NULL;
10,101✔
3643
    if (strlen(pShow->db) > 0) {
10,101✔
3644
      pDb = mndAcquireDb(pMnode, pShow->db);
77✔
3645
      if (pDb == NULL && TSDB_CODE_MND_DB_NOT_EXIST != terrno && pBlock->info.rows == 0) return terrno;
77!
3646
    }
3647

3648
    char typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
10,101✔
3649
    STR_TO_VARSTR(typeName, "SUPER_TABLE");
10,101✔
3650
    bool fetch = pShow->restore ? false : true;
10,101✔
3651
    pShow->restore = false;
10,101✔
3652
    while (numOfRows < rows) {
803,095✔
3653
      if (fetch) {
803,094✔
3654
        pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb);
803,070✔
3655
        if (pShow->pIter == NULL) break;
803,094✔
3656
      } else {
3657
        fetch = true;
24✔
3658
        void *pKey = taosHashGetKey(pShow->pIter, NULL);
24✔
3659
        pStb = sdbAcquire(pSdb, SDB_STB, pKey);
24✔
3660
        if (!pStb) continue;
36!
3661
      }
3662

3663
      if (pDb != NULL && pStb->dbUid != pDb->uid) {
793,017✔
3664
        sdbRelease(pSdb, pStb);
12✔
3665
        continue;
12✔
3666
      }
3667

3668
      SName name = {0};
793,005✔
3669
      char  stbName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
793,005✔
3670
      mndExtractTbNameFromStbFullName(pStb->name, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN);
793,005✔
3671
      if (pShow->filterTb[0] && strncmp(pShow->filterTb, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN) != 0) {
793,001!
3672
        sdbRelease(pSdb, pStb);
×
3673
        continue;
×
3674
      }
3675

3676
      if ((numOfRows + pStb->numOfColumns) > rows) {
793,001✔
3677
        pShow->restore = true;
24✔
3678
        if (numOfRows == 0) {
24!
3679
          mError("mndRetrieveStbCol failed to get stable cols since buf:%d less than result:%d, stable name:%s, db:%s",
×
3680
                 rows, pStb->numOfColumns, pStb->name, pStb->db);
3681
        }
3682
        sdbRelease(pSdb, pStb);
24✔
3683
        break;
24✔
3684
      }
3685

3686
      varDataSetLen(stbName, strlen(&stbName[VARSTR_HEADER_SIZE]));
792,977✔
3687

3688
      mDebug("mndRetrieveStbCol get stable cols, stable name:%s, db:%s", pStb->name, pStb->db);
792,977✔
3689

3690
      char db[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
792,977✔
3691
      RETRIEVE_CHECK_GOTO(tNameFromString(&name, pStb->db, T_NAME_ACCT | T_NAME_DB), pStb, &lino, _OVER);
792,977!
3692
      RETRIEVE_CHECK_GOTO(tNameGetDbName(&name, varDataVal(db)), pStb, &lino, _OVER);
792,953!
3693
      varDataSetLen(db, strlen(varDataVal(db)));
792,970✔
3694

3695
      for (int i = 0; i < pStb->numOfColumns; i++) {
19,558,817✔
3696
        int32_t          cols = 0;
18,797,671✔
3697
        SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
18,797,671✔
3698
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stbName, false), pStb, &lino, _OVER);
18,534,223!
3699

3700
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
18,641,350✔
3701
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)db, false), pStb, &lino, _OVER);
18,424,609!
3702

3703
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
18,620,333✔
3704
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, typeName, false), pStb, &lino, _OVER);
18,407,422!
3705

3706
        // col name
3707
        char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
18,602,577✔
3708
        STR_TO_VARSTR(colName, pStb->pColumns[i].name);
18,602,577✔
3709
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
18,602,577✔
3710
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, colName, false), pStb, &lino, _OVER);
18,657,065!
3711

3712
        // col type
3713
        int8_t colType = pStb->pColumns[i].type;
18,663,715✔
3714
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
18,663,715✔
3715
        char colTypeStr[VARSTR_HEADER_SIZE + 32];
3716
        int  colTypeLen =
19,178,836✔
3717
            tsnprintf(varDataVal(colTypeStr), sizeof(colTypeStr) - VARSTR_HEADER_SIZE, "%s", tDataTypes[colType].name);
18,492,357✔
3718
        if (colType == TSDB_DATA_TYPE_VARCHAR) {
19,178,836✔
3719
          colTypeLen +=
1,513,369✔
3720
              tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE,
1,513,388✔
3721
                        "(%d)", (int32_t)(pStb->pColumns[i].bytes - VARSTR_HEADER_SIZE));
1,513,388✔
3722
        } else if (colType == TSDB_DATA_TYPE_NCHAR) {
17,665,448✔
3723
          colTypeLen +=
1,521,317✔
3724
              tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE,
1,521,275✔
3725
                        "(%d)", (int32_t)((pStb->pColumns[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
1,521,275✔
3726
        } else if (IS_DECIMAL_TYPE(colType)) {
16,144,173!
3727
          STypeMod typeMod = pStb->pExtSchemas[i].typeMod;
×
3728
          uint8_t prec = 0, scale = 0;
×
3729
          decimalFromTypeMod(typeMod, &prec, &scale);
×
3730
          colTypeLen += sprintf(varDataVal(colTypeStr) + colTypeLen, "(%d,%d)", prec, scale);
×
3731
        }
3732
        varDataSetLen(colTypeStr, colTypeLen);
19,180,900✔
3733
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (char *)colTypeStr, false), pStb, &lino, _OVER);
19,180,900!
3734

3735
        // col length
3736
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
18,733,655✔
3737
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->pColumns[i].bytes, false), pStb,
18,481,480!
3738
                            &lino, _OVER);
3739
        
3740
        // col precision, col scale, col nullable, col source
3741
        for (int32_t j = 6; j <= 9; ++j) {
89,821,161✔
3742
          pColInfo = taosArrayGet(pBlock->pDataBlock, j);
71,831,495✔
3743
          colDataSetNULL(pColInfo, numOfRows);
71,285,779✔
3744
        }
3745

3746
        // col id
3747
        pColInfo = taosArrayGet(pBlock->pDataBlock, 10);
17,989,666✔
3748
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->pColumns[i].colId, false), pStb,
18,615,933!
3749
                            &lino, _OVER);
3750
        numOfRows++;
18,765,847✔
3751
      }
3752

3753
      sdbRelease(pSdb, pStb);
761,146✔
3754
    }
3755

3756
    if (pDb != NULL) {
10,102✔
3757
      mndReleaseDb(pMnode, pDb);
77✔
3758
    }
3759
  }
3760

3761
  mDebug("mndRetrieveStbCol success, rows:%d, pShow->numOfRows:%d", numOfRows, pShow->numOfRows);
10,103✔
3762
  goto _OVER;
10,103✔
3763

3764
_ERROR:
3765
  mError("failed to mndRetrieveStbCol, rows:%d, pShow->numOfRows:%d, at %s:%d since %s", numOfRows, pShow->numOfRows,
3766
         __FUNCTION__, lino, tstrerror(code));
3767

3768
_OVER:
10,103✔
3769
  pShow->numOfRows += numOfRows;
10,103✔
3770
  return numOfRows;
10,103✔
3771
}
3772

3773
static void mndCancelGetNextStb(SMnode *pMnode, void *pIter) {
1✔
3774
  SSdb *pSdb = pMnode->pSdb;
1✔
3775
  sdbCancelFetchByType(pSdb, pIter, SDB_STB);
1✔
3776
}
1✔
3777

3778
const char *mndGetStbStr(const char *src) {
×
3779
  char *posDb = strstr(src, TS_PATH_DELIMITER);
×
3780
  if (posDb != NULL) ++posDb;
×
3781
  if (posDb == NULL) return src;
×
3782

3783
  char *posStb = strstr(posDb, TS_PATH_DELIMITER);
×
3784
  if (posStb != NULL) ++posStb;
×
3785
  if (posStb == NULL) return posDb;
×
3786
  return posStb;
×
3787
}
3788

3789
static int32_t mndCheckIndexReq(SCreateTagIndexReq *pReq) {
×
3790
  // impl
3791
  return TSDB_CODE_SUCCESS;
×
3792
}
3793

3794
/*int32_t mndAddIndexImpl(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp, void *sql,
3795
                        int32_t len) {
3796
  // impl later
3797
  int32_t code = 0;
3798
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "create-stb-index");
3799
  if (pTrans == NULL) goto _OVER;
3800

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

3805
  if (mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb) != 0) goto _OVER;
3806
  if (mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb) != 0) goto _OVER;
3807
  if (mndSetAlterStbRedoActions2(pMnode, pTrans, pDb, pStb, sql, len) != 0) goto _OVER;
3808
  if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
3809

3810
  return code;
3811

3812
_OVER:
3813
  mndTransDrop(pTrans);
3814
  return code;
3815
}
3816
static int32_t mndAddIndex(SMnode *pMnode, SRpcMsg *pReq, SCreateTagIndexReq *tagIdxReq, SDbObj *pDb, SStbObj *pOld) {
3817
  bool    needRsp = true;
3818
  int32_t code = -1;
3819
  SField *pField0 = NULL;
3820

3821
  SStbObj  stbObj = {0};
3822
  SStbObj *pNew = &stbObj;
3823

3824
  taosRLockLatch(&pOld->lock);
3825
  memcpy(&stbObj, pOld, sizeof(SStbObj));
3826
  taosRUnLockLatch(&pOld->lock);
3827

3828
  stbObj.pColumns = NULL;
3829
  stbObj.pTags = NULL;
3830
  stbObj.updateTime = taosGetTimestampMs();
3831
  stbObj.lock = 0;
3832

3833
  int32_t tag = mndFindSuperTableTagIndex(pOld, tagIdxReq->colName);
3834
  if (tag < 0) {
3835
    terrno = TSDB_CODE_MND_TAG_NOT_EXIST;
3836
    return -1;
3837
  }
3838
  if (mndAllocStbSchemas(pOld, pNew) != 0) {
3839
    return -1;
3840
  }
3841

3842
  SSchema *pTag = pNew->pTags + tag;
3843
  if (IS_IDX_ON(pTag)) {
3844
    terrno = TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST;
3845
    return -1;
3846
  } else {
3847
    pTag->flags |= COL_IDX_ON;
3848
  }
3849
  pNew->tagVer++;
3850

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

3853
  return code;
3854
}
3855
static int32_t mndProcessCreateIndexReq(SRpcMsg *pReq) {
3856
  SMnode            *pMnode = pReq->info.node;
3857
  int32_t            code = -1;
3858
  SDbObj            *pDb = NULL;
3859
  SStbObj           *pStb = NULL;
3860
  SCreateTagIndexReq tagIdxReq = {0};
3861

3862
  if (tDeserializeSCreateTagIdxReq(pReq->pCont, pReq->contLen, &tagIdxReq) != 0) {
3863
    terrno = TSDB_CODE_INVALID_MSG;
3864
    goto _OVER;
3865
  }
3866

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

3869
  if (mndCheckIndexReq(&tagIdxReq) != TSDB_CODE_SUCCESS) {
3870
    goto _OVER;
3871
  }
3872

3873
  pDb = mndAcquireDbByStb(pMnode, tagIdxReq.dbFName);
3874
  if (pDb == NULL) {
3875
    terrno = TSDB_CODE_MND_DB_NOT_EXIST;
3876
    goto _OVER;
3877
  }
3878

3879
  pStb = mndAcquireStb(pMnode, tagIdxReq.stbName);
3880
  if (pStb == NULL) {
3881
    terrno = TSDB_CODE_MND_STB_NOT_EXIST;
3882
    goto _OVER;
3883
  }
3884
  if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_WRITE_DB, pDb) != 0) {
3885
    goto _OVER;
3886
  }
3887

3888
  code = mndAddIndex(pMnode, pReq, &tagIdxReq, pDb, pStb);
3889
  if (terrno == TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST || terrno == TSDB_CODE_MND_TAG_NOT_EXIST) {
3890
    return terrno;
3891
  } else {
3892
    if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
3893
  }
3894
_OVER:
3895
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
3896
    mError("stb:%s, failed to create index since %s", tagIdxReq.stbName, terrstr());
3897
  }
3898
  mndReleaseStb(pMnode, pStb);
3899
  mndReleaseDb(pMnode, pDb);
3900
  return code;
3901
}
3902
static int32_t mndProcessDropIndexReq(SRpcMsg *pReq) {
3903
  SMnode          *pMnode = pReq->info.node;
3904
  int32_t          code = -1;
3905
  SDbObj          *pDb = NULL;
3906
  SStbObj         *pStb = NULL;
3907
  SDropTagIndexReq dropReq = {0};
3908
  if (tDeserializeSDropTagIdxReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
3909
    terrno = TSDB_CODE_INVALID_MSG;
3910
    goto _OVER;
3911
  }
3912
  //
3913
  return TSDB_CODE_SUCCESS;
3914
_OVER:
3915
  return code;
3916
}*/
3917

3918
static int32_t mndProcessDropStbReqFromMNode(SRpcMsg *pReq) {
×
3919
  int32_t code = mndProcessDropStbReq(pReq);
×
3920
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
×
3921
    pReq->info.rsp = rpcMallocCont(1);
×
3922
    pReq->info.rspLen = 1;
×
3923
    pReq->info.noResp = false;
×
3924
    pReq->code = code;
×
3925
  }
3926
  return code;
×
3927
}
3928

3929
typedef struct SVDropTbVgReqs {
3930
  SArray     *pBatchReqs;
3931
  SVgroupInfo info;
3932
} SVDropTbVgReqs;
3933

3934
typedef struct SMDropTbDbInfo {
3935
  SArray *dbVgInfos;
3936
  int32_t hashPrefix;
3937
  int32_t hashSuffix;
3938
  int32_t hashMethod;
3939
} SMDropTbDbInfo;
3940

3941
typedef struct SMDropTbTsmaInfo {
3942
  char           tsmaResTbDbFName[TSDB_DB_FNAME_LEN];
3943
  char           tsmaResTbNamePrefix[TSDB_TABLE_FNAME_LEN];
3944
  int32_t        suid;
3945
  SMDropTbDbInfo dbInfo;  // reference to DbInfo in pDbMap
3946
} SMDropTbTsmaInfo;
3947

3948
typedef struct SMDropTbTsmaInfos {
3949
  SArray *pTsmaInfos;  // SMDropTbTsmaInfo
3950
} SMDropTbTsmaInfos;
3951

3952
typedef struct SMndDropTbsWithTsmaCtx {
3953
  SHashObj *pVgMap;  // <vgId, SVDropTbVgReqs>
3954
} SMndDropTbsWithTsmaCtx;
3955

3956
static int32_t mndDropTbForSingleVg(SMnode *pMnode, SMndDropTbsWithTsmaCtx *pCtx, SArray *pTbs, int32_t vgId);
3957

3958
static void destroySVDropTbBatchReqs(void *p);
3959
static void mndDestroyDropTbsWithTsmaCtx(SMndDropTbsWithTsmaCtx *p) {
16✔
3960
  if (!p) return;
16!
3961

3962
  if (p->pVgMap) {
16!
3963
    void *pIter = taosHashIterate(p->pVgMap, NULL);
16✔
3964
    while (pIter) {
32✔
3965
      SVDropTbVgReqs *pReqs = pIter;
16✔
3966
      taosArrayDestroyEx(pReqs->pBatchReqs, destroySVDropTbBatchReqs);
16✔
3967
      pIter = taosHashIterate(p->pVgMap, pIter);
16✔
3968
    }
3969
    taosHashCleanup(p->pVgMap);
16✔
3970
  }
3971
  taosMemoryFree(p);
16!
3972
}
3973

3974
static int32_t mndInitDropTbsWithTsmaCtx(SMndDropTbsWithTsmaCtx **ppCtx) {
16✔
3975
  int32_t                 code = 0;
16✔
3976
  SMndDropTbsWithTsmaCtx *pCtx = taosMemoryCalloc(1, sizeof(SMndDropTbsWithTsmaCtx));
16!
3977
  if (!pCtx) return terrno;
16!
3978

3979
  pCtx->pVgMap = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_NO_LOCK);
16✔
3980
  if (!pCtx->pVgMap) {
16!
3981
    code = terrno;
×
3982
    goto _end;
×
3983
  }
3984

3985
  *ppCtx = pCtx;
16✔
3986
_end:
16✔
3987
  if (code) mndDestroyDropTbsWithTsmaCtx(pCtx);
16!
3988
  return code;
16✔
3989
}
3990

3991
static void *mndBuildVDropTbsReq(SMnode *pMnode, const SVgroupInfo *pVgInfo, const SVDropTbBatchReq *pReq,
41✔
3992
                                 int32_t *len) {
3993
  int32_t   contLen = 0;
41✔
3994
  int32_t   ret = 0;
41✔
3995
  SMsgHead *pHead = NULL;
41✔
3996
  SEncoder  encoder = {0};
41✔
3997

3998
  tEncodeSize(tEncodeSVDropTbBatchReq, pReq, contLen, ret);
41!
3999
  if (ret < 0) return NULL;
41!
4000

4001
  contLen += sizeof(SMsgHead);
41✔
4002
  pHead = taosMemoryMalloc(contLen);
41!
4003
  if (pHead == NULL) {
41!
4004
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
4005
    return NULL;
×
4006
  }
4007

4008
  pHead->contLen = htonl(contLen);
41✔
4009
  pHead->vgId = htonl(pVgInfo->vgId);
41✔
4010

4011
  void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
41✔
4012

4013
  tEncoderInit(&encoder, pBuf, contLen - sizeof(SMsgHead));
41✔
4014
  int32_t code = tEncodeSVDropTbBatchReq(&encoder, pReq);
41✔
4015
  tEncoderClear(&encoder);
41✔
4016
  if (code != 0) return NULL;
41!
4017

4018
  *len = contLen;
41✔
4019
  return pHead;
41✔
4020
}
4021

4022
static int32_t mndSetDropTbsRedoActions(SMnode *pMnode, STrans *pTrans, const SVDropTbVgReqs *pVgReqs, void *pCont,
41✔
4023
                                        int32_t contLen, tmsg_t msgType) {
4024
  STransAction action = {0};
41✔
4025
  action.epSet = pVgReqs->info.epSet;
41✔
4026
  action.pCont = pCont;
41✔
4027
  action.contLen = contLen;
41✔
4028
  action.msgType = msgType;
41✔
4029
  action.acceptableCode = TSDB_CODE_TDB_TABLE_NOT_EXIST;
41✔
4030
  return mndTransAppendRedoAction(pTrans, &action);
41✔
4031
}
4032

4033
static int32_t mndBuildDropTbRedoActions(SMnode *pMnode, STrans *pTrans, SHashObj *pVgMap, tmsg_t msgType) {
11✔
4034
  int32_t code = 0;
11✔
4035
  void   *pIter = taosHashIterate(pVgMap, NULL);
11✔
4036
  while (pIter) {
22✔
4037
    const SVDropTbVgReqs *pVgReqs = pIter;
11✔
4038
    int32_t               len = 0;
11✔
4039
    for (int32_t i = 0; i < taosArrayGetSize(pVgReqs->pBatchReqs) && code == TSDB_CODE_SUCCESS; ++i) {
52!
4040
      SVDropTbBatchReq *pBatchReq = taosArrayGet(pVgReqs->pBatchReqs, i);
41✔
4041
      void             *p = mndBuildVDropTbsReq(pMnode, &pVgReqs->info, pBatchReq, &len);
41✔
4042
      if (!p) {
41!
4043
        code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
4044
        if (terrno != 0) code = terrno;
×
4045
        break;
×
4046
      }
4047
      if ((code = mndSetDropTbsRedoActions(pMnode, pTrans, pVgReqs, p, len, msgType)) != 0) {
41!
4048
        break;
×
4049
      }
4050
    }
4051
    if (TSDB_CODE_SUCCESS != code) {
11!
4052
      taosHashCancelIterate(pVgMap, pIter);
×
4053
      break;
×
4054
    }
4055
    pIter = taosHashIterate(pVgMap, pIter);
11✔
4056
  }
4057
  return code;
11✔
4058
}
4059

4060
static int32_t mndCreateDropTbsTxnPrepare(SRpcMsg *pRsp, SMndDropTbsWithTsmaCtx *pCtx) {
16✔
4061
  int32_t code = 0;
16✔
4062
  SMnode *pMnode = pRsp->info.node;
16✔
4063
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, pRsp, "drop-tbs");
16✔
4064
  mndTransSetChangeless(pTrans);
16✔
4065
  mndTransSetSerial(pTrans);
16✔
4066
  if (pTrans == NULL) {
16!
4067
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
4068
    if (terrno != 0) code = terrno;
×
4069
    goto _OVER;
×
4070
  }
4071

4072
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
16✔
4073

4074
  if ((code = mndBuildDropTbRedoActions(pMnode, pTrans, pCtx->pVgMap, TDMT_VND_DROP_TABLE)) != 0) goto _OVER;
11!
4075
  if ((code = mndTransPrepare(pMnode, pTrans)) != 0) goto _OVER;
11!
4076

4077
_OVER:
11✔
4078
  mndTransDrop(pTrans);
16✔
4079
  TAOS_RETURN(code);
16✔
4080
}
4081

4082
static int32_t mndProcessDropTbWithTsma(SRpcMsg *pReq) {
×
4083
  int32_t      code = -1;
×
4084
  SMnode      *pMnode = pReq->info.node;
×
4085
  SDbObj      *pDb = NULL;
×
4086
  SStbObj     *pStb = NULL;
×
4087
  SMDropTbsReq dropReq = {0};
×
4088
  bool         locked = false;
×
4089
  if (tDeserializeSMDropTbsReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
×
4090
    code = TSDB_CODE_INVALID_MSG;
×
4091
    goto _OVER;
×
4092
  }
4093

4094
  SMndDropTbsWithTsmaCtx *pCtx = NULL;
×
4095
  code = mndInitDropTbsWithTsmaCtx(&pCtx);
×
4096
  if (code) goto _OVER;
×
4097
  for (int32_t i = 0; i < dropReq.pVgReqs->size; ++i) {
×
4098
    SMDropTbReqsOnSingleVg *pReq = taosArrayGet(dropReq.pVgReqs, i);
×
4099
    code = mndDropTbForSingleVg(pMnode, pCtx, pReq->pTbs, pReq->vgInfo.vgId);
×
4100
    if (code) goto _OVER;
×
4101
  }
4102
  code = mndCreateDropTbsTxnPrepare(pReq, pCtx);
×
4103
  if (code == 0) {
×
4104
    code = TSDB_CODE_ACTION_IN_PROGRESS;
×
4105
  }
4106
_OVER:
×
4107
  tFreeSMDropTbsReq(&dropReq);
×
4108
  if (pCtx) mndDestroyDropTbsWithTsmaCtx(pCtx);
×
4109
  TAOS_RETURN(code);
×
4110
}
4111

4112
static int32_t createDropTbBatchReq(const SVDropTbReq *pReq, SVDropTbBatchReq *pBatchReq) {
63✔
4113
  pBatchReq->nReqs = 1;
63✔
4114
  pBatchReq->pArray = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SVDropTbReq));
63✔
4115
  if (!pBatchReq->pArray) return terrno;
63!
4116
  if (taosArrayPush(pBatchReq->pArray, pReq) == NULL) {
126!
4117
    taosArrayDestroy(pBatchReq->pArray);
×
4118
    pBatchReq->pArray = NULL;
×
4119
    return terrno;
×
4120
  }
4121
  return TSDB_CODE_SUCCESS;
63✔
4122
}
4123

4124
static void destroySVDropTbBatchReqs(void *p) {
63✔
4125
  SVDropTbBatchReq *pReq = p;
63✔
4126
  taosArrayDestroy(pReq->pArray);
63✔
4127
  pReq->pArray = NULL;
63✔
4128
}
63✔
4129

4130
static int32_t mndDropTbAdd(SMnode *pMnode, SHashObj *pVgHashMap, const SVgroupInfo *pVgInfo, char *name, tb_uid_t suid,
63✔
4131
                            bool ignoreNotExists) {
4132
  SVDropTbReq req = {.name = name, .suid = suid, .igNotExists = ignoreNotExists, .uid = 0};
63✔
4133

4134
  SVDropTbVgReqs *pVgReqs = taosHashGet(pVgHashMap, &pVgInfo->vgId, sizeof(pVgInfo->vgId));
63✔
4135
  SVDropTbVgReqs  vgReqs = {0};
63✔
4136
  if (pVgReqs == NULL) {
63✔
4137
    vgReqs.info = *pVgInfo;
16✔
4138
    vgReqs.pBatchReqs = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SVDropTbBatchReq));
16✔
4139
    if (!vgReqs.pBatchReqs) return terrno;
16!
4140
    SVDropTbBatchReq batchReq = {0};
16✔
4141
    int32_t          code = createDropTbBatchReq(&req, &batchReq);
16✔
4142
    if (TSDB_CODE_SUCCESS != code) return code;
16!
4143
    if (taosArrayPush(vgReqs.pBatchReqs, &batchReq) == NULL) {
32!
4144
      taosArrayDestroy(batchReq.pArray);
×
4145
      return terrno;
×
4146
    }
4147
    if (taosHashPut(pVgHashMap, &pVgInfo->vgId, sizeof(pVgInfo->vgId), &vgReqs, sizeof(vgReqs)) != 0) {
16!
4148
      taosArrayDestroyEx(vgReqs.pBatchReqs, destroySVDropTbBatchReqs);
×
4149
      return terrno;
×
4150
    }
4151
  } else {
4152
    SVDropTbBatchReq batchReq = {0};
47✔
4153
    int32_t          code = createDropTbBatchReq(&req, &batchReq);
47✔
4154
    if (TSDB_CODE_SUCCESS != code) return code;
47!
4155
    if (taosArrayPush(pVgReqs->pBatchReqs, &batchReq) == NULL) {
94!
4156
      taosArrayDestroy(batchReq.pArray);
×
4157
      return terrno;
×
4158
    }
4159
  }
4160
  return 0;
63✔
4161
}
4162

4163
static int32_t mndDropTbForSingleVg(SMnode *pMnode, SMndDropTbsWithTsmaCtx *pCtx, SArray *pTbs, int32_t vgId) {
16✔
4164
  int32_t code = 0;
16✔
4165

4166
  SVgObj *pVgObj = mndAcquireVgroup(pMnode, vgId);
16✔
4167
  if (!pVgObj) {
16!
4168
    code = 0;
×
4169
    goto _end;
×
4170
  }
4171
  SVgroupInfo vgInfo = {.hashBegin = pVgObj->hashBegin,
16✔
4172
                        .hashEnd = pVgObj->hashEnd,
16✔
4173
                        .numOfTable = pVgObj->numOfTables,
16✔
4174
                        .vgId = pVgObj->vgId};
16✔
4175
  vgInfo.epSet = mndGetVgroupEpset(pMnode, pVgObj);
16✔
4176
  mndReleaseVgroup(pMnode, pVgObj);
16✔
4177

4178
  for (int32_t i = 0; i < pTbs->size; ++i) {
79✔
4179
    SVDropTbReq *pTb = taosArrayGet(pTbs, i);
63✔
4180
    TAOS_CHECK_GOTO(mndDropTbAdd(pMnode, pCtx->pVgMap, &vgInfo, pTb->name, pTb->suid, pTb->igNotExists), NULL, _end);
63!
4181
  }
4182
_end:
16✔
4183
  return code;
16✔
4184
}
4185

4186
static int32_t mndProcessFetchTtlExpiredTbs(SRpcMsg *pRsp) {
58,267✔
4187
  int32_t                 code = -1;
58,267✔
4188
  SDecoder                decoder = {0};
58,267✔
4189
  SMnode                 *pMnode = pRsp->info.node;
58,267✔
4190
  SVFetchTtlExpiredTbsRsp rsp = {0};
58,267✔
4191
  SMndDropTbsWithTsmaCtx *pCtx = NULL;
58,267✔
4192
  if (pRsp->code != TSDB_CODE_SUCCESS) {
58,267✔
4193
    code = pRsp->code;
134✔
4194
    goto _end;
134✔
4195
  }
4196
  if (pRsp->contLen == 0) {
58,133✔
4197
    code = 0;
58,117✔
4198
    goto _end;
58,117✔
4199
  }
4200

4201
  tDecoderInit(&decoder, pRsp->pCont, pRsp->contLen);
16✔
4202
  code = tDecodeVFetchTtlExpiredTbsRsp(&decoder, &rsp);
16✔
4203
  if (code) goto _end;
16!
4204

4205
  code = mndInitDropTbsWithTsmaCtx(&pCtx);
16✔
4206
  if (code) goto _end;
16!
4207

4208
  code = mndDropTbForSingleVg(pMnode, pCtx, rsp.pExpiredTbs, rsp.vgId);
16✔
4209
  if (code) goto _end;
16!
4210
  code = mndCreateDropTbsTxnPrepare(pRsp, pCtx);
16✔
4211
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
16✔
4212
_end:
5✔
4213
  if (pCtx) mndDestroyDropTbsWithTsmaCtx(pCtx);
58,267✔
4214
  tDecoderClear(&decoder);
58,267✔
4215
  tFreeFetchTtlExpiredTbsRsp(&rsp);
58,267✔
4216
  TAOS_RETURN(code);
58,267✔
4217
}
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