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

taosdata / TDengine / #4886

16 Dec 2025 01:13AM UTC coverage: 65.292% (+0.03%) from 65.258%
#4886

push

travis-ci

web-flow
fix: compile error (#33938)

178718 of 273721 relevant lines covered (65.29%)

103311111.65 hits per line

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

76.64
/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  mndProcessTrimDbRsp(SRpcMsg *pReq);
50
static int32_t  mndProcessTrimDbWalRsp(SRpcMsg *pReq);
51
static int32_t  mndProcessTableMetaReq(SRpcMsg *pReq);
52
static int32_t  mndRetrieveStb(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
53
static int32_t  mndRetrieveStbCol(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
54
static void     mndCancelGetNextStb(SMnode *pMnode, void *pIter);
55
static int32_t  mndProcessTableCfgReq(SRpcMsg *pReq);
56
static int32_t  mndAlterStbImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
57
                               void *alterOriData, int32_t alterOriDataLen);
58
static int32_t  mndAlterStbAndUpdateTagIdxImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
59
                                              void *alterOriData, int32_t alterOriDataLen, const SMAlterStbReq *pAlter);
60

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

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

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

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

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

104
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STB, mndRetrieveStb);
498,147✔
105
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_STB, mndCancelGetNextStb);
498,147✔
106

107
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_COL, mndRetrieveStbCol);
498,147✔
108
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_COL, mndCancelGetNextStb);
498,147✔
109

110
  return sdbSetTable(pMnode->pSdb, table);
498,147✔
111
}
112

113
void mndCleanupStb(SMnode *pMnode) {}
498,030✔
114

115
SSdbRaw *mndStbActionEncode(SStbObj *pStb) {
16,402,641✔
116
  int32_t code = 0;
16,402,641✔
117
  int32_t lino = 0;
16,402,641✔
118
  bool    hasTypeMod = false;
16,402,641✔
119
  terrno = TSDB_CODE_OUT_OF_MEMORY;
16,402,641✔
120

121
  int32_t size = sizeof(SStbObj) + (pStb->numOfColumns + pStb->numOfTags) * sizeof(SSchema) + pStb->commentLen +
16,403,401✔
122
                 pStb->ast1Len + pStb->ast2Len + pStb->numOfColumns * sizeof(SColCmpr) + STB_RESERVE_SIZE +
16,403,401✔
123
                 taosArrayGetSize(pStb->pFuncs) * TSDB_FUNC_NAME_LEN + sizeof(int32_t) * pStb->numOfColumns;
16,402,641✔
124
  SSdbRaw *pRaw = sdbAllocRaw(SDB_STB, STB_VER_NUMBER, size);
16,402,641✔
125
  if (pRaw == NULL) goto _OVER;
16,402,641✔
126

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

150
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
1,267,448,782✔
151
    SSchema *pSchema = &pStb->pColumns[i];
1,251,046,141✔
152
    SDB_SET_INT8(pRaw, dataPos, pSchema->type, _OVER)
1,251,046,141✔
153
    SDB_SET_INT8(pRaw, dataPos, pSchema->flags, _OVER)
1,251,046,141✔
154
    SDB_SET_INT16(pRaw, dataPos, pSchema->colId, _OVER)
1,251,046,141✔
155
    SDB_SET_INT32(pRaw, dataPos, pSchema->bytes, _OVER)
1,251,046,141✔
156
    SDB_SET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
1,251,046,141✔
157
    hasTypeMod = hasTypeMod || HAS_TYPE_MOD(pSchema);
1,251,046,141✔
158
  }
159

160
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
130,604,655✔
161
    SSchema *pSchema = &pStb->pTags[i];
114,202,014✔
162
    SDB_SET_INT8(pRaw, dataPos, pSchema->type, _OVER)
114,202,014✔
163
    SDB_SET_INT8(pRaw, dataPos, pSchema->flags, _OVER)
114,202,014✔
164
    SDB_SET_INT16(pRaw, dataPos, pSchema->colId, _OVER)
114,202,014✔
165
    SDB_SET_INT32(pRaw, dataPos, pSchema->bytes, _OVER)
114,202,014✔
166
    SDB_SET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
114,202,014✔
167
  }
168

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

174
  if (pStb->commentLen > 0) {
16,402,641✔
175
    SDB_SET_BINARY(pRaw, dataPos, pStb->comment, pStb->commentLen + 1, _OVER)
70,360✔
176
  }
177

178
  if (pStb->ast1Len > 0) {
16,402,641✔
179
    SDB_SET_BINARY(pRaw, dataPos, pStb->pAst1, pStb->ast1Len, _OVER)
×
180
  }
181

182
  if (pStb->ast2Len > 0) {
16,402,641✔
183
    SDB_SET_BINARY(pRaw, dataPos, pStb->pAst2, pStb->ast2Len, _OVER)
×
184
  }
185

186
  if (pStb->pCmpr != NULL) {
16,402,641✔
187
    for (int i = 0; i < pStb->numOfColumns; i++) {
1,267,448,782✔
188
      SColCmpr *p = &pStb->pCmpr[i];
1,251,046,141✔
189
      SDB_SET_INT16(pRaw, dataPos, p->id, _OVER)
1,251,046,141✔
190
      SDB_SET_INT32(pRaw, dataPos, p->alg, _OVER)
1,251,046,141✔
191
    }
192
  }
193
  SDB_SET_INT64(pRaw, dataPos, pStb->keep, _OVER)
16,402,641✔
194

195
  if (hasTypeMod) {
16,402,641✔
196
    for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
940,955,246✔
197
      SDB_SET_INT32(pRaw, dataPos, pStb->pExtSchemas[i].typeMod, _OVER);
935,133,086✔
198
    }
199
  }
200

201
  SDB_SET_INT8(pRaw, dataPos, pStb->virtualStb, _OVER)
16,402,641✔
202
  SDB_SET_RESERVE(pRaw, dataPos, STB_RESERVE_SIZE, _OVER)
16,402,641✔
203
  SDB_SET_DATALEN(pRaw, dataPos, _OVER)
16,402,641✔
204

205
  terrno = 0;
16,402,641✔
206

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

214
  mTrace("stb:%s, encode to raw:%p, row:%p", pStb->name, pRaw, pStb);
16,402,641✔
215
  return pRaw;
16,402,641✔
216
}
217

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

226
  int8_t sver = 0;
17,543,407✔
227
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
17,543,407✔
228

229
  if (sver > STB_VER_NUMBER) {
17,543,407✔
230
    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
×
231
    goto _OVER;
×
232
  }
233

234
  pRow = sdbAllocRow(sizeof(SStbObj));
17,543,407✔
235
  if (pRow == NULL) goto _OVER;
17,543,407✔
236

237
  pStb = sdbGetRowObj(pRow);
17,543,407✔
238
  if (pStb == NULL) goto _OVER;
17,543,407✔
239

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

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

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

280
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
234,304,711✔
281
    SSchema *pSchema = &pStb->pTags[i];
216,761,304✔
282
    SDB_GET_INT8(pRaw, dataPos, &pSchema->type, _OVER)
216,761,304✔
283
    SDB_GET_INT8(pRaw, dataPos, &pSchema->flags, _OVER)
216,761,304✔
284
    SDB_GET_INT16(pRaw, dataPos, &pSchema->colId, _OVER)
216,761,304✔
285
    SDB_GET_INT32(pRaw, dataPos, &pSchema->bytes, _OVER)
216,761,304✔
286
    SDB_GET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
216,761,304✔
287
  }
288

289
  for (int32_t i = 0; i < pStb->numOfFuncs; ++i) {
17,543,407✔
290
    char funcName[TSDB_FUNC_NAME_LEN] = {0};
×
291
    SDB_GET_BINARY(pRaw, dataPos, funcName, TSDB_FUNC_NAME_LEN, _OVER)
×
292
    if (taosArrayPush(pStb->pFuncs, funcName) == NULL) goto _OVER;
×
293
  }
294

295
  if (pStb->commentLen > 0) {
17,543,407✔
296
    pStb->comment = taosMemoryCalloc(pStb->commentLen + 1, 1);
67,990✔
297
    if (pStb->comment == NULL) goto _OVER;
67,990✔
298
    SDB_GET_BINARY(pRaw, dataPos, pStb->comment, pStb->commentLen + 1, _OVER)
67,990✔
299
  }
300

301
  if (pStb->ast1Len > 0) {
17,543,407✔
302
    pStb->pAst1 = taosMemoryCalloc(pStb->ast1Len, 1);
×
303
    if (pStb->pAst1 == NULL) goto _OVER;
×
304
    SDB_GET_BINARY(pRaw, dataPos, pStb->pAst1, pStb->ast1Len, _OVER)
×
305
  }
306

307
  if (pStb->ast2Len > 0) {
17,543,407✔
308
    pStb->pAst2 = taosMemoryCalloc(pStb->ast2Len, 1);
×
309
    if (pStb->pAst2 == NULL) goto _OVER;
×
310
    SDB_GET_BINARY(pRaw, dataPos, pStb->pAst2, pStb->ast2Len, _OVER)
×
311
  }
312

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

332
  // type mod
333
  if (hasExtSchemas) {
17,543,407✔
334
    pStb->pExtSchemas = taosMemoryCalloc(pStb->numOfColumns, sizeof(SExtSchema));
8,473,856✔
335
    if (!pStb->pExtSchemas) goto _OVER;
8,473,856✔
336
    for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
2,147,483,647✔
337
      SSchema *pSchema = &pStb->pColumns[i];
2,147,483,647✔
338
      SDB_GET_INT32(pRaw, dataPos, &pStb->pExtSchemas[i].typeMod, _OVER)
2,147,483,647✔
339
    }
340
  }
341

342
  if (sver < STB_VER_NUMBER) {
17,543,407✔
343
    pStb->virtualStb = 0;
×
344
  } else {
345
    SDB_GET_INT8(pRaw, dataPos, &pStb->virtualStb, _OVER)
17,543,407✔
346
  }
347

348
  SDB_GET_RESERVE(pRaw, dataPos, STB_RESERVE_SIZE, _OVER)
17,543,407✔
349

350
  terrno = 0;
17,543,407✔
351

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

366
  mTrace("stb:%s, decode from raw:%p, row:%p", pStb->name, pRaw, pStb);
17,543,407✔
367
  return pRow;
17,543,407✔
368
}
369

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

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

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

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

396
  taosWLockLatch(&pOld->lock);
13,254,976✔
397
  int32_t numOfColumns = pOld->numOfColumns;
13,254,976✔
398
  if (pOld->numOfColumns < pNew->numOfColumns) {
13,254,976✔
399
    void *pColumns = taosMemoryMalloc(pNew->numOfColumns * sizeof(SSchema));
3,165,615✔
400
    if (pColumns == NULL) {
3,165,615✔
401
      goto END;
×
402
    }
403
    taosMemoryFree(pOld->pColumns);
3,165,615✔
404
    pOld->pColumns = pColumns;
3,165,615✔
405
  }
406

407
  if (pOld->numOfTags < pNew->numOfTags) {
13,254,976✔
408
    void *pTags = taosMemoryMalloc(pNew->numOfTags * sizeof(SSchema));
401,006✔
409
    if (pTags == NULL) {
401,006✔
410
      goto END;
×
411
    }
412
    taosMemoryFree(pOld->pTags);
401,006✔
413
    pOld->pTags = pTags;
401,006✔
414
  }
415

416
  if (pOld->commentLen < pNew->commentLen && pNew->commentLen > 0) {
13,254,976✔
417
    void *comment = taosMemoryMalloc(pNew->commentLen + 1);
4,810✔
418
    if (comment == NULL) {
4,810✔
419
      goto END;
×
420
    }
421
    taosMemoryFree(pOld->comment);
4,810✔
422
    pOld->comment = comment;
4,810✔
423
  }
424
  pOld->commentLen = pNew->commentLen;
13,254,976✔
425

426
  if (pOld->ast1Len < pNew->ast1Len) {
13,254,976✔
427
    void *pAst1 = taosMemoryMalloc(pNew->ast1Len + 1);
×
428
    if (pAst1 == NULL) {
×
429
      goto END;
×
430
    }
431
    taosMemoryFree(pOld->pAst1);
×
432
    pOld->pAst1 = pAst1;
×
433
  }
434

435
  if (pOld->ast2Len < pNew->ast2Len) {
13,254,976✔
436
    void *pAst2 = taosMemoryMalloc(pNew->ast2Len + 1);
×
437
    if (pAst2 == NULL) {
×
438
      goto END;
×
439
    }
440
    taosMemoryFree(pOld->pAst2);
×
441
    pOld->pAst2 = pAst2;
×
442
  }
443

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

483
  if (pNew->pExtSchemas) {
13,254,976✔
484
    taosMemoryFreeClear(pOld->pExtSchemas);
8,425,755✔
485
    pOld->pExtSchemas = taosMemoryCalloc(pNew->numOfColumns, sizeof(SExtSchema));
8,425,755✔
486
    if (pOld->pExtSchemas == NULL){
8,425,755✔
487
      goto END;
×
488
    }
489
    memcpy(pOld->pExtSchemas, pNew->pExtSchemas, pNew->numOfColumns * sizeof(SExtSchema));
8,425,755✔
490
  }
491

492
END:
4,829,221✔
493
  taosWUnLockLatch(&pOld->lock);
13,254,976✔
494
  return terrno;
13,254,976✔
495
}
496

497
SStbObj *mndAcquireStb(SMnode *pMnode, char *stbName) {
31,624,409✔
498
  SSdb    *pSdb = pMnode->pSdb;
31,624,409✔
499
  SStbObj *pStb = sdbAcquire(pSdb, SDB_STB, stbName);
31,624,409✔
500
  if (pStb == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
31,624,409✔
501
    terrno = TSDB_CODE_MND_STB_NOT_EXIST;
2,955,158✔
502
  }
503
  return pStb;
31,624,409✔
504
}
505

506
void mndReleaseStb(SMnode *pMnode, SStbObj *pStb) {
30,940,714✔
507
  SSdb *pSdb = pMnode->pSdb;
30,940,714✔
508
  sdbRelease(pSdb, pStb);
30,940,714✔
509
}
30,940,714✔
510

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

515
  char db[TSDB_TABLE_FNAME_LEN] = {0};
8,466,112✔
516
  if ((terrno = tNameGetFullDbName(&name, db)) != 0) return NULL;
8,466,112✔
517

518
  return mndAcquireDb(pMnode, db);
8,466,112✔
519
}
520

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

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

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

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

560
  req.colCmpred = 1;
11,635,605✔
561
  SColCmprWrapper *pCmpr = &req.colCmpr;
11,635,605✔
562
  req.keep = pStb->keep;
11,635,605✔
563
  pCmpr->version = pStb->colVer;
11,635,605✔
564
  pCmpr->nCols = pStb->numOfColumns;
11,635,605✔
565

566
  req.colCmpr.pColCmpr = taosMemoryCalloc(pCmpr->nCols, sizeof(SColCmpr));
11,635,605✔
567
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
1,225,020,166✔
568
    SColCmpr *p = &pCmpr->pColCmpr[i];
1,213,384,561✔
569
    p->alg = pStb->pCmpr[i].alg;
1,213,384,561✔
570
    p->id = pStb->pCmpr[i].id;
1,213,384,561✔
571
  }
572

573
  req.pExtSchemas = pStb->pExtSchemas; // only reference to it.
11,635,605✔
574
  // get length
575
  int32_t ret = 0;
11,635,605✔
576
  tEncodeSize(tEncodeSVCreateStbReq, &req, contLen, ret);
11,635,605✔
577
  if (ret < 0) {
11,635,605✔
578
    goto _err;
×
579
  }
580

581
  contLen += sizeof(SMsgHead);
11,635,605✔
582

583
  SMsgHead *pHead = taosMemoryCalloc(1, contLen);
11,635,605✔
584
  if (pHead == NULL) {
11,635,605✔
585
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
586
    goto _err;
×
587
  }
588

589
  pHead->contLen = htonl(contLen);
11,635,605✔
590
  pHead->vgId = htonl(pVgroup->vgId);
11,635,605✔
591

592
  void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
11,635,605✔
593
  tEncoderInit(&encoder, pBuf, contLen - sizeof(SMsgHead));
11,635,605✔
594
  if (tEncodeSVCreateStbReq(&encoder, &req) < 0) {
11,635,605✔
595
    taosMemoryFreeClear(pHead);
×
596
    tEncoderClear(&encoder);
×
597
    goto _err;
×
598
  }
599
  tEncoderClear(&encoder);
11,635,605✔
600

601
  *pContLen = contLen;
11,635,605✔
602
  taosMemoryFreeClear(req.rsmaParam.name);
11,635,605✔
603
  taosMemoryFreeClear(req.rsmaParam.funcColIds);
11,635,605✔
604
  taosMemoryFreeClear(req.rsmaParam.funcIds);
11,635,605✔
605
  taosMemoryFreeClear(req.colCmpr.pColCmpr);
11,635,605✔
606
  return pHead;
11,635,605✔
607
_err:
×
608
  taosMemoryFreeClear(req.rsmaParam.name);
×
609
  taosMemoryFreeClear(req.rsmaParam.funcColIds);
×
610
  taosMemoryFreeClear(req.rsmaParam.funcIds);
×
611
  taosMemoryFreeClear(req.colCmpr.pColCmpr);
×
612
  return NULL;
×
613
}
614

615
static void *mndBuildVDropStbReq(SMnode *pMnode, SVgObj *pVgroup, SStbObj *pStb, int32_t *pContLen) {
5,576,616✔
616
  SName        name = {0};
5,576,616✔
617
  SVDropStbReq req = {0};
5,576,616✔
618
  int32_t      contLen = 0;
5,576,616✔
619
  int32_t      ret = 0;
5,576,616✔
620
  SMsgHead    *pHead = NULL;
5,576,616✔
621
  SEncoder     encoder = {0};
5,576,616✔
622

623
  if ((terrno = tNameFromString(&name, pStb->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0) {
5,576,616✔
624
    return NULL;
×
625
  }
626

627
  req.name = (char *)tNameGetTableName(&name);
5,576,616✔
628
  req.suid = pStb->uid;
5,576,616✔
629

630
  tEncodeSize(tEncodeSVDropStbReq, &req, contLen, ret);
5,576,616✔
631
  if (ret < 0) return NULL;
5,576,616✔
632

633
  contLen += sizeof(SMsgHead);
5,576,616✔
634
  pHead = taosMemoryMalloc(contLen);
5,576,616✔
635
  if (pHead == NULL) {
5,576,616✔
636
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
637
    return NULL;
×
638
  }
639

640
  pHead->contLen = htonl(contLen);
5,576,616✔
641
  pHead->vgId = htonl(pVgroup->vgId);
5,576,616✔
642

643
  void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
5,576,616✔
644

645
  tEncoderInit(&encoder, pBuf, contLen - sizeof(SMsgHead));
5,576,616✔
646
  int32_t code = tEncodeSVDropStbReq(&encoder, &req);
5,576,616✔
647
  tEncoderClear(&encoder);
5,576,616✔
648
  if (code != 0) {
5,576,616✔
649
    terrno = code;
×
650
    return NULL;
×
651
  }
652

653
  *pContLen = contLen;
5,576,616✔
654
  return pHead;
5,576,616✔
655
}
656

657
int32_t mndCheckCreateStbReq(SMCreateStbReq *pCreate) {
1,961,548✔
658
  int32_t code = 0;
1,961,548✔
659
  if (pCreate->igExists < 0 || pCreate->igExists > 1) {
1,961,548✔
660
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
661
    TAOS_RETURN(code);
×
662
  }
663

664
  if (pCreate->virtualStb != 0 && pCreate->virtualStb != 1) {
1,961,548✔
665
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
666
    TAOS_RETURN(code);
×
667
  }
668

669
  int32_t maxColumns = pCreate->virtualStb ? TSDB_MAX_COLUMNS : TSDB_MAX_COLUMNS_NON_VIRTUAL;
1,961,548✔
670
  if (pCreate->numOfColumns < TSDB_MIN_COLUMNS || pCreate->numOfTags + pCreate->numOfColumns > maxColumns) {
1,961,548✔
671
    code = TSDB_CODE_PAR_INVALID_COLUMNS_NUM;
×
672
    TAOS_RETURN(code);
×
673
  }
674

675
  if (pCreate->numOfTags <= 0 || pCreate->numOfTags > TSDB_MAX_TAGS) {
1,961,548✔
676
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
677
    TAOS_RETURN(code);
×
678
  }
679

680
  SField *pField = taosArrayGet(pCreate->pColumns, 0);
1,961,548✔
681
  if (pField->type != TSDB_DATA_TYPE_TIMESTAMP) {
1,961,548✔
682
    code = TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
683
    TAOS_RETURN(code);
×
684
  }
685

686
  for (int32_t i = 0; i < pCreate->numOfColumns; ++i) {
138,538,233✔
687
    SFieldWithOptions *pField1 = taosArrayGet(pCreate->pColumns, i);
136,576,685✔
688
    if (pField1->type >= TSDB_DATA_TYPE_MAX) {
136,576,685✔
689
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
690
      TAOS_RETURN(code);
×
691
    }
692
    if (pField1->bytes <= 0) {
136,576,685✔
693
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
694
      TAOS_RETURN(code);
×
695
    }
696
    if (pField1->name[0] == 0) {
136,576,685✔
697
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
698
      TAOS_RETURN(code);
×
699
    }
700
  }
701

702
  for (int32_t i = 0; i < pCreate->numOfTags; ++i) {
9,588,714✔
703
    SField *pField1 = taosArrayGet(pCreate->pTags, i);
7,627,166✔
704
    if (pField1->type >= TSDB_DATA_TYPE_MAX) {
7,627,166✔
705
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
706
      TAOS_RETURN(code);
×
707
    }
708
    if (pField1->bytes <= 0) {
7,627,166✔
709
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
710
      TAOS_RETURN(code);
×
711
    }
712
    if (pField1->name[0] == 0) {
7,627,166✔
713
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
714
      TAOS_RETURN(code);
×
715
    }
716
  }
717

718
  TAOS_RETURN(code);
1,961,548✔
719
}
720

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

735
  TAOS_RETURN(code);
×
736
}
737

738
int32_t mndSetCreateStbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
1,937,689✔
739
  int32_t  code = 0;
1,937,689✔
740
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
1,937,689✔
741
  if (pCommitRaw == NULL) {
1,937,689✔
742
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
743
    if (terrno != 0) code = terrno;
×
744
    TAOS_RETURN(code);
×
745
  }
746
  if ((code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
1,937,689✔
747
    sdbFreeRaw(pCommitRaw);
×
748
    TAOS_RETURN(code);
×
749
  }
750
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
1,937,689✔
751

752
  TAOS_RETURN(code);
1,937,689✔
753
}
754

755
static int32_t mndSetCreateStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
1,933,819✔
756
  int32_t code = 0;
1,933,819✔
757
  SSdb   *pSdb = pMnode->pSdb;
1,933,819✔
758
  SVgObj *pVgroup = NULL;
1,933,819✔
759
  void   *pIter = NULL;
1,933,819✔
760
  int32_t contLen;
1,933,479✔
761

762
  while (1) {
7,437,330✔
763
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
9,371,149✔
764
    if (pIter == NULL) break;
9,371,149✔
765
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
7,437,330✔
766
      sdbRelease(pSdb, pVgroup);
2,863,671✔
767
      continue;
2,863,671✔
768
    }
769

770
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, NULL, 0);
4,573,659✔
771
    if (pReq == NULL) {
4,573,659✔
772
      sdbCancelFetch(pSdb, pIter);
×
773
      sdbRelease(pSdb, pVgroup);
×
774
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
775
      if (terrno != 0) code = terrno;
×
776
      TAOS_RETURN(code);
×
777
    }
778

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

796
  TAOS_RETURN(code);
1,933,819✔
797
}
798

799
int32_t mndSetForceDropCreateStbRedoActions(SMnode *pMnode, STrans *pTrans, SVgObj *pVgroup, SStbObj *pStb) {
×
800
  int32_t code = 0;
×
801
  SSdb   *pSdb = pMnode->pSdb;
×
802
  int32_t contLen;
×
803

804
  void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, NULL, 0);
×
805
  if (pReq == NULL) {
×
806
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
807
    if (terrno != 0) code = terrno;
×
808
    TAOS_RETURN(code);
×
809
  }
810

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

825
  TAOS_RETURN(code);
×
826
}
827

828
static int32_t mndSetCreateStbUndoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
1,933,819✔
829
  int32_t code = 0;
1,933,819✔
830
  SSdb   *pSdb = pMnode->pSdb;
1,933,819✔
831
  SVgObj *pVgroup = NULL;
1,933,819✔
832
  void   *pIter = NULL;
1,933,819✔
833

834
  while (1) {
7,437,330✔
835
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
9,371,149✔
836
    if (pIter == NULL) break;
9,371,149✔
837
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
7,437,330✔
838
      sdbRelease(pSdb, pVgroup);
2,863,671✔
839
      continue;
2,863,671✔
840
    }
841

842
    int32_t contLen = 0;
4,573,659✔
843
    void   *pReq = mndBuildVDropStbReq(pMnode, pVgroup, pStb, &contLen);
4,573,659✔
844
    if (pReq == NULL) {
4,573,659✔
845
      sdbCancelFetch(pSdb, pIter);
×
846
      sdbRelease(pSdb, pVgroup);
×
847
      code = TSDB_CODE_OUT_OF_MEMORY;
×
848
      TAOS_RETURN(code);
×
849
    }
850

851
    STransAction action = {0};
4,573,659✔
852
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
4,573,659✔
853
    action.pCont = pReq;
4,573,659✔
854
    action.contLen = contLen;
4,573,659✔
855
    action.msgType = TDMT_VND_DROP_STB;
4,573,659✔
856
    action.acceptableCode = TSDB_CODE_TDB_STB_NOT_EXIST;
4,573,659✔
857
    if ((code = mndTransAppendUndoAction(pTrans, &action)) != 0) {
4,573,659✔
858
      taosMemoryFree(pReq);
×
859
      sdbCancelFetch(pSdb, pIter);
×
860
      sdbRelease(pSdb, pVgroup);
×
861
      TAOS_RETURN(code);
×
862
    }
863
    sdbRelease(pSdb, pVgroup);
4,573,659✔
864
  }
865

866
  TAOS_RETURN(code);
1,933,819✔
867
}
868

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

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

909
  if (pDst->commentLen > 0) {
1,938,369✔
910
    pDst->comment = taosMemoryCalloc(pDst->commentLen + 1, 1);
9,201✔
911
    if (pDst->comment == NULL) {
9,201✔
912
      code = terrno;
×
913
      TAOS_RETURN(code);
×
914
    }
915
    memcpy(pDst->comment, pCreate->pComment, pDst->commentLen + 1);
9,201✔
916
  }
917

918
  pDst->ast1Len = pCreate->ast1Len;
1,938,369✔
919
  if (pDst->ast1Len > 0) {
1,938,369✔
920
    pDst->pAst1 = taosMemoryCalloc(pDst->ast1Len, 1);
×
921
    if (pDst->pAst1 == NULL) {
×
922
      code = terrno;
×
923
      TAOS_RETURN(code);
×
924
    }
925
    memcpy(pDst->pAst1, pCreate->pAst1, pDst->ast1Len);
×
926
  }
927

928
  pDst->ast2Len = pCreate->ast2Len;
1,938,369✔
929
  if (pDst->ast2Len > 0) {
1,938,369✔
930
    pDst->pAst2 = taosMemoryCalloc(pDst->ast2Len, 1);
×
931
    if (pDst->pAst2 == NULL) {
×
932
      code = terrno;
×
933
      TAOS_RETURN(code);
×
934
    }
935
    memcpy(pDst->pAst2, pCreate->pAst2, pDst->ast2Len);
×
936
  }
937

938
  pDst->pColumns = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SSchema));
1,938,369✔
939
  pDst->pTags = taosMemoryCalloc(1, pDst->numOfTags * sizeof(SSchema));
1,938,369✔
940
  if (pDst->pColumns == NULL || pDst->pTags == NULL) {
1,938,369✔
941
    code = terrno;
×
942
    TAOS_RETURN(code);
×
943
  }
944

945
  if (pDst->nextColId < 0 || pDst->nextColId >= 0x7fff - pDst->numOfColumns - pDst->numOfTags) {
1,938,369✔
946
    code = TSDB_CODE_OUT_OF_RANGE;
964✔
947
    TAOS_RETURN(code);
964✔
948
  }
949

950
  for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
106,764,666✔
951
    SFieldWithOptions *pField = taosArrayGet(pCreate->pColumns, i);
104,827,261✔
952
    SSchema           *pSchema = &pDst->pColumns[i];
104,827,261✔
953
    pSchema->type = pField->type;
104,827,261✔
954
    pSchema->bytes = pField->bytes;
104,827,261✔
955
    pSchema->flags = pField->flags;
104,827,261✔
956
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
104,827,261✔
957
    pSchema->colId = pDst->nextColId;
104,827,261✔
958
    pDst->nextColId++;
104,827,261✔
959
    hasTypeMods = hasTypeMods || HAS_TYPE_MOD(pSchema);
104,827,261✔
960
  }
961

962
  for (int32_t i = 0; i < pDst->numOfTags; ++i) {
9,413,349✔
963
    SField  *pField = taosArrayGet(pCreate->pTags, i);
7,475,944✔
964
    SSchema *pSchema = &pDst->pTags[i];
7,475,944✔
965
    pSchema->type = pField->type;
7,475,944✔
966
    pSchema->bytes = pField->bytes;
7,475,944✔
967
    if (i == 0) {
7,475,944✔
968
      SSCHMEA_SET_IDX_ON(pSchema);
1,937,405✔
969
    }
970
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
7,475,944✔
971
    pSchema->colId = pDst->nextColId;
7,475,944✔
972
    pDst->nextColId++;
7,475,944✔
973
  }
974
  // set col compress
975
  pDst->pCmpr = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SCmprObj));
1,937,405✔
976
  for (int32_t i = 0; i < pDst->numOfColumns; i++) {
106,764,666✔
977
    SFieldWithOptions *pField = taosArrayGet(pCreate->pColumns, i);
104,827,261✔
978
    SSchema           *pSchema = &pDst->pColumns[i];
104,827,261✔
979

980
    SColCmpr *pColCmpr = &pDst->pCmpr[i];
104,827,261✔
981
    pColCmpr->id = pSchema->colId;
104,827,261✔
982
    pColCmpr->alg = pField->compress;
104,827,261✔
983
  }
984

985
  if (hasTypeMods) {
1,937,405✔
986
    pDst->pExtSchemas = taosMemoryCalloc(pDst->numOfColumns, sizeof(SExtSchema));
23,760✔
987
    if (!pDst->pExtSchemas) {
23,760✔
988
      code = terrno;
×
989
      TAOS_RETURN(code);
×
990
    }
991
    for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
394,712✔
992
      SFieldWithOptions * pField = taosArrayGet(pCreate->pColumns, i);
370,952✔
993
      pDst->pExtSchemas[i].typeMod = pField->typeMod;
370,952✔
994
    }
995
  }
996
  TAOS_RETURN(code);
1,937,405✔
997
}
998
int32_t mndGenIdxNameForFirstTag(char *fullname, char *dbname, char *stbname, char *tagname) {
1,845,875✔
999
  SName name = {0};
1,845,875✔
1000
  if ((terrno = tNameFromString(&name, stbname, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0) {
1,845,875✔
1001
    return -1;
×
1002
  }
1003
  return snprintf(fullname, TSDB_INDEX_FNAME_LEN, "%s.%s_%s", dbname, tagname, tNameGetTableName(&name));
1,845,875✔
1004
}
1005

1006
static int32_t mndCreateStb(SMnode *pMnode, SRpcMsg *pReq, SMCreateStbReq *pCreate, SDbObj *pDb) {
1,842,969✔
1007
  SStbObj stbObj = {0};
1,842,969✔
1008
  int32_t code = -1;
1,842,969✔
1009

1010
  char fullIdxName[TSDB_INDEX_FNAME_LEN * 2] = {0};
1,842,969✔
1011

1012
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_DB_INSIDE, pReq, "create-stb");
1,842,969✔
1013
  if (pTrans == NULL) {
1,842,969✔
1014
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1015
    if (terrno != 0) code = terrno;
×
1016
    goto _OVER;
×
1017
  }
1018

1019
  mInfo("trans:%d, used to create stb:%s", pTrans->id, pCreate->name);
1,842,969✔
1020
  TAOS_CHECK_GOTO(mndBuildStbFromReq(pMnode, &stbObj, pCreate, pDb), NULL, _OVER);
1,842,969✔
1021

1022
  SSchema *pSchema = &(stbObj.pTags[0]);
1,842,005✔
1023
  if (mndGenIdxNameForFirstTag(fullIdxName, pDb->name, stbObj.name, pSchema->name) < 0) {
1,842,005✔
1024
    goto _OVER;
×
1025
  }
1026
  SSIdx idx = {0};
1,842,005✔
1027
  if (mndAcquireGlobalIdx(pMnode, fullIdxName, SDB_IDX, &idx) == 0 && idx.pIdx != NULL) {
1,842,005✔
1028
    code = TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST;
×
1029
    mndReleaseIdx(pMnode, idx.pIdx);
×
1030
    goto _OVER;
×
1031
  }
1032

1033
  SIdxObj idxObj = {0};
1,842,005✔
1034
  memcpy(idxObj.name, fullIdxName, TSDB_INDEX_FNAME_LEN);
1,842,005✔
1035
  memcpy(idxObj.stb, stbObj.name, TSDB_TABLE_FNAME_LEN);
1,842,005✔
1036
  memcpy(idxObj.db, stbObj.db, TSDB_DB_FNAME_LEN);
1,842,005✔
1037
  memcpy(idxObj.colName, pSchema->name, TSDB_COL_NAME_LEN);
1,842,005✔
1038
  idxObj.createdTime = taosGetTimestampMs();
1,842,005✔
1039
  idxObj.uid = mndGenerateUid(fullIdxName, strlen(fullIdxName));
1,842,005✔
1040
  idxObj.stbUid = stbObj.uid;
1,842,005✔
1041
  idxObj.dbUid = stbObj.dbUid;
1,842,005✔
1042

1043
  TAOS_CHECK_GOTO(mndSetCreateIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
1,842,005✔
1044

1045
  TAOS_CHECK_GOTO(mndAddStbToTrans(pMnode, pTrans, pDb, &stbObj), NULL, _OVER);
1,842,005✔
1046
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
1,838,419✔
1047
  code = 0;
1,838,419✔
1048

1049
_OVER:
1,842,969✔
1050
  mndTransDrop(pTrans);
1,842,969✔
1051
  if (mndStbActionDelete(pMnode->pSdb, &stbObj) != 0) mError("failed to mndStbActionDelete");
1,842,969✔
1052
  TAOS_RETURN(code);
1,842,969✔
1053
}
1054

1055
int32_t mndAddStbToTrans(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
1,937,405✔
1056
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
1,937,405✔
1057
  TAOS_CHECK_RETURN(mndTransCheckConflict(pMnode, pTrans));
1,937,405✔
1058
  TAOS_CHECK_RETURN(mndSetCreateStbCommitLogs(pMnode, pTrans, pDb, pStb));
1,933,819✔
1059
  TAOS_CHECK_RETURN(mndSetCreateStbRedoActions(pMnode, pTrans, pDb, pStb));
1,933,819✔
1060
  TAOS_CHECK_RETURN(mndSetCreateStbUndoActions(pMnode, pTrans, pDb, pStb));
1,933,819✔
1061
  return 0;
1,933,819✔
1062
}
1063

1064
static int32_t mndProcessTtlTimer(SRpcMsg *pReq) {
2,036,308✔
1065
  SMnode           *pMnode = pReq->info.node;
2,036,308✔
1066
  SSdb             *pSdb = pMnode->pSdb;
2,036,308✔
1067
  SVgObj           *pVgroup = NULL;
2,036,308✔
1068
  void             *pIter = NULL;
2,036,308✔
1069
  SVDropTtlTableReq ttlReq = {
2,036,308✔
1070
      .timestampSec = taosGetTimestampSec(), .ttlDropMaxCount = tsTtlBatchDropNum, .nUids = 0, .pTbUids = NULL};
2,036,308✔
1071
  int32_t reqLen = tSerializeSVDropTtlTableReq(NULL, 0, &ttlReq);
2,036,308✔
1072
  int32_t contLen = reqLen + sizeof(SMsgHead);
2,036,308✔
1073

1074
  mDebug("start to process ttl timer");
2,036,308✔
1075

1076
  while (1) {
7,551,151✔
1077
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
9,587,459✔
1078
    if (pIter == NULL) break;
9,587,459✔
1079

1080
    if (pVgroup->mountVgId) {
7,551,151✔
1081
      sdbRelease(pSdb, pVgroup);
3,884✔
1082
      continue;
3,884✔
1083
    }
1084

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

1099
    SRpcMsg rpcMsg = {
7,547,267✔
1100
        .msgType = TDMT_VND_FETCH_TTL_EXPIRED_TBS, .pCont = pHead, .contLen = contLen, .info = pReq->info};
1101
    SEpSet epSet = mndGetVgroupEpset(pMnode, pVgroup);
7,547,267✔
1102
    code = tmsgSendReq(&epSet, &rpcMsg);
7,547,267✔
1103
    if (code != 0) {
7,547,267✔
1104
      mError("vgId:%d, failed to send drop ttl table request to vnode since 0x%x", pVgroup->vgId, code);
25,967✔
1105
    } else {
1106
      mDebug("vgId:%d, send drop ttl table request to vnode, time:%" PRId32, pVgroup->vgId, ttlReq.timestampSec);
7,521,300✔
1107
    }
1108
    sdbRelease(pSdb, pVgroup);
7,547,267✔
1109
  }
1110

1111
  return 0;
2,036,308✔
1112
}
1113

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

1130
  while (1) {
1131
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
1132
    if (pIter == NULL) break;
1133
    if (pVgroup->mountVgId) {
1134
      sdbRelease(pSdb, pVgroup);
1135
      continue;
1136
    }
1137

1138
    int32_t code = 0;
1139

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

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

1165
  return 0;
1166
}
1167
#endif
1168

1169
static int32_t mndFindSuperTableTagIndex(const SStbObj *pStb, const char *tagName) {
3,810,801✔
1170
  for (int32_t tag = 0; tag < pStb->numOfTags; tag++) {
42,621,361✔
1171
    if (strcmp(pStb->pTags[tag].name, tagName) == 0) {
39,695,446✔
1172
      return tag;
884,886✔
1173
    }
1174
  }
1175

1176
  return -1;
2,925,915✔
1177
}
1178

1179
static int32_t mndFindSuperTableColumnIndex(const SStbObj *pStb, const char *colName) {
5,627,294✔
1180
  for (int32_t col = 0; col < pStb->numOfColumns; col++) {
464,491,894✔
1181
    if (strcmp(pStb->pColumns[col].name, colName) == 0) {
461,495,514✔
1182
      return col;
2,630,914✔
1183
    }
1184
  }
1185

1186
  return -1;
2,996,380✔
1187
}
1188

1189
static bool mndValidateSchema(SSchema *pSchemas, int32_t nSchema, SArray *pFields, int32_t maxLen) {
3,147,453✔
1190
  int32_t rowLen = 0;
3,147,453✔
1191
  for (int32_t i = 0; i < nSchema; ++i) {
289,169,847✔
1192
    rowLen += (pSchemas + i)->bytes;
286,022,394✔
1193
  }
1194

1195
  int32_t nField = taosArrayGetSize(pFields);
3,147,453✔
1196
  for (int32_t i = 0; i < nField; ++i) {
6,294,906✔
1197
    rowLen += ((SField *)TARRAY_GET_ELEM(pFields, i))->bytes;
3,147,453✔
1198
  }
1199

1200
  return rowLen <= maxLen;
3,147,453✔
1201
}
1202

1203
static int32_t mndBuildStbFromAlter(SStbObj *pStb, SStbObj *pDst, SMCreateStbReq *createReq) {
13,560✔
1204
  int32_t code = 0;
13,560✔
1205
  taosRLockLatch(&pStb->lock);
13,560✔
1206
  memcpy(pDst, pStb, sizeof(SStbObj));
13,560✔
1207
  taosRUnLockLatch(&pStb->lock);
13,560✔
1208

1209
  pDst->source = createReq->source;
13,560✔
1210
  pDst->updateTime = taosGetTimestampMs();
13,560✔
1211
  pDst->numOfColumns = createReq->numOfColumns;
13,560✔
1212
  pDst->numOfTags = createReq->numOfTags;
13,560✔
1213
  pDst->pColumns = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SSchema));
13,560✔
1214
  pDst->pTags = taosMemoryCalloc(1, pDst->numOfTags * sizeof(SSchema));
13,560✔
1215
  pDst->pCmpr = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SColCmpr));
13,560✔
1216
  pDst->pExtSchemas = taosMemoryCalloc(pDst->numOfColumns, sizeof(SExtSchema));
13,560✔
1217

1218
  if (pDst->pColumns == NULL || pDst->pTags == NULL || pDst->pCmpr == NULL || pDst->pExtSchemas == NULL) {
13,560✔
1219
    code = terrno;
×
1220
    TAOS_RETURN(code);
×
1221
  }
1222

1223
  if (pDst->nextColId < 0 || pDst->nextColId >= 0x7fff - pDst->numOfColumns - pDst->numOfTags) {
13,560✔
1224
    code = TSDB_CODE_OUT_OF_RANGE;
×
1225
    TAOS_RETURN(code);
×
1226
  }
1227

1228
  for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
103,409✔
1229
    SFieldWithOptions *pField = taosArrayGet(createReq->pColumns, i);
89,849✔
1230
    SSchema           *pSchema = &pDst->pColumns[i];
89,849✔
1231
    pSchema->type = pField->type;
89,849✔
1232
    pSchema->bytes = pField->bytes;
89,849✔
1233
    pSchema->flags = pField->flags;
89,849✔
1234
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
89,849✔
1235
    int32_t cIndex = mndFindSuperTableColumnIndex(pStb, pField->name);
89,849✔
1236
    if (cIndex >= 0) {
89,849✔
1237
      pSchema->colId = pStb->pColumns[cIndex].colId;
83,303✔
1238
    } else {
1239
      pSchema->colId = pDst->nextColId++;
6,546✔
1240
    }
1241
  }
1242

1243
  for (int32_t i = 0; i < pDst->numOfTags; ++i) {
105,669✔
1244
    SField  *pField = taosArrayGet(createReq->pTags, i);
92,109✔
1245
    SSchema *pSchema = &pDst->pTags[i];
92,109✔
1246
    pSchema->type = pField->type;
92,109✔
1247
    pSchema->bytes = pField->bytes;
92,109✔
1248
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
92,109✔
1249
    int32_t cIndex = mndFindSuperTableTagIndex(pStb, pField->name);
92,109✔
1250
    if (cIndex >= 0) {
92,109✔
1251
      pSchema->colId = pStb->pTags[cIndex].colId;
86,652✔
1252
    } else {
1253
      pSchema->colId = pDst->nextColId++;
5,457✔
1254
    }
1255
  }
1256
  for (int32_t i = 0; i < pDst->numOfColumns; i++) {
103,409✔
1257
    SColCmpr          *p = pDst->pCmpr + i;
89,849✔
1258
    SFieldWithOptions *pField = taosArrayGet(createReq->pColumns, i);
89,849✔
1259
    SSchema           *pSchema = &pDst->pColumns[i];
89,849✔
1260
    p->id = pSchema->colId;
89,849✔
1261
    if (pField->compress == 0) {
89,849✔
1262
      p->alg = createDefaultColCmprByType(pSchema->type);
×
1263
    } else {
1264
      p->alg = pField->compress;
89,849✔
1265
    }
1266
    if (pField->flags & COL_HAS_TYPE_MOD) {
89,849✔
1267
      pDst->pExtSchemas[i].typeMod = pField->typeMod;
272✔
1268
    }
1269
  }
1270
  pDst->tagVer = createReq->tagVer;
13,560✔
1271
  pDst->colVer = createReq->colVer;
13,560✔
1272
  return TSDB_CODE_SUCCESS;
13,560✔
1273
}
1274

1275
// used for tmq_get_json_meta to build alter msg
1276
static void buildAlterMsg(SStbObj *pStb, SStbObj *pDst, void** pAlterBuf, int32_t* len){
13,560✔
1277
  SMAlterStbReq alterReq = {0};
13,560✔
1278
  alterReq.pFields = taosArrayInit(2, sizeof(SField));
13,560✔
1279
  if (NULL == alterReq.pFields) {
13,560✔
1280
    mError("failed to init alter fields array");
×
1281
    goto END;
×
1282
  }
1283
  tstrncpy(alterReq.name, pStb->name, TSDB_TABLE_FNAME_LEN);
13,560✔
1284
  for (int32_t i = 0; i < pDst->numOfColumns && taosArrayGetSize(alterReq.pFields) == 0; ++i) {
101,311✔
1285
    SSchema           *pSchema = &pDst->pColumns[i];
87,751✔
1286
    int32_t cIndex = mndFindSuperTableColumnIndex(pStb, pSchema->name);
87,751✔
1287
    if (cIndex >= 0 && pSchema->bytes == pStb->pColumns[cIndex].bytes) {
87,751✔
1288
      continue;
80,089✔
1289
    }
1290
    if (cIndex < 0) {
7,662✔
1291
      alterReq.alterType = TSDB_ALTER_TABLE_ADD_COLUMN;
6,546✔
1292
    } else if (pSchema->bytes > pStb->pColumns[cIndex].bytes){
1,116✔
1293
      alterReq.alterType = TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES;
1,116✔
1294
    }
1295
    SField *pAlterField = taosArrayReserve(alterReq.pFields, 1);
7,662✔
1296
    pAlterField->type = pSchema->type;
7,662✔
1297
    pAlterField->bytes = pSchema->bytes;
7,662✔
1298
    tstrncpy(pAlterField->name, pSchema->name, TSDB_COL_NAME_LEN);
7,662✔
1299
    mDebug("alter column name:%s, type:%d, bytes:%d", pAlterField->name, pAlterField->type, pAlterField->bytes);
7,662✔
1300
  }
1301

1302
  for (int32_t i = 0; i < pDst->numOfTags && taosArrayGetSize(alterReq.pFields) == 0; ++i) {
68,084✔
1303
    SSchema *pSchema = &pDst->pTags[i];
54,524✔
1304
    int32_t cIndex = mndFindSuperTableTagIndex(pStb, pSchema->name);
54,524✔
1305
    if (cIndex >= 0 && pSchema->bytes == pStb->pTags[cIndex].bytes) {
54,524✔
1306
      continue;
48,694✔
1307
    }
1308
    if (cIndex < 0) {
5,830✔
1309
      alterReq.alterType = TSDB_ALTER_TABLE_ADD_TAG;
5,457✔
1310
    } else if (pSchema->bytes > pStb->pTags[cIndex].bytes){
373✔
1311
      alterReq.alterType = TSDB_ALTER_TABLE_UPDATE_TAG_BYTES;
373✔
1312
    }
1313
    SField *pAlterField = taosArrayReserve(alterReq.pFields, 1);
5,830✔
1314
    pAlterField->type = pSchema->type;
5,830✔
1315
    pAlterField->bytes = pSchema->bytes;
5,830✔
1316
    tstrncpy(pAlterField->name, pSchema->name, TSDB_COL_NAME_LEN);
5,830✔
1317
    mDebug("alter tag name:%s, type:%d, bytes:%d", pAlterField->name, pAlterField->type, pAlterField->bytes);
5,830✔
1318
  }
1319
  alterReq.numOfFields = taosArrayGetSize(alterReq.pFields);
13,560✔
1320
  if (alterReq.numOfFields == 0) {
13,560✔
1321
    mError("no valid alter field found");
68✔
1322
    goto END;
68✔
1323
  }
1324

1325
  int32_t contLen = tSerializeSMAlterStbReq(NULL, 0, &alterReq);
13,492✔
1326
  if (contLen <= 0) {
13,492✔
1327
    mError("failed to get alter stb req len");
×
1328
    goto END;
×
1329
  }
1330
  void*   buf = taosMemoryMalloc(contLen);
13,492✔
1331
  if (buf == NULL) {
13,492✔
1332
    mError("failed to malloc alter stb req buf");
×
1333
    goto END;
×
1334
  }
1335
  int32_t code = tSerializeSMAlterStbReq(buf, contLen, &alterReq);
13,492✔
1336
  if (code <= TSDB_CODE_SUCCESS) {
13,492✔
1337
    mError("failed to serialize alter stb req %d", code);
×
1338
    taosMemoryFreeClear(buf);
×
1339
    goto END;
×
1340
  }
1341
  *pAlterBuf = buf;
13,492✔
1342
  *len = contLen;
13,492✔
1343
END:
13,560✔
1344
  taosArrayDestroy(alterReq.pFields);
13,560✔
1345
}
13,560✔
1346

1347
static int32_t mndProcessCreateStbReq(SRpcMsg *pReq) {
1,866,148✔
1348
  SMnode        *pMnode = pReq->info.node;
1,866,148✔
1349
  int32_t        code = -1;
1,866,148✔
1350
  SStbObj       *pStb = NULL;
1,866,148✔
1351
  SDbObj        *pDb = NULL;
1,866,148✔
1352
  SMCreateStbReq createReq = {0};
1,866,148✔
1353
  bool           isAlter = false;
1,866,148✔
1354
  SHashObj      *pHash = NULL;
1,866,148✔
1355

1356
  if (tDeserializeSMCreateStbReq(pReq->pCont, pReq->contLen, &createReq) != 0) {
1,866,148✔
1357
    code = TSDB_CODE_INVALID_MSG;
×
1358
    goto _OVER;
×
1359
  }
1360

1361
  mInfo("stb:%s, start to create", createReq.name);
1,866,148✔
1362
  if (mndCheckCreateStbReq(&createReq) != 0) {
1,866,148✔
1363
    code = TSDB_CODE_INVALID_MSG;
×
1364
    goto _OVER;
×
1365
  }
1366

1367
  pStb = mndAcquireStb(pMnode, createReq.name);
1,866,148✔
1368
  if (pStb != NULL) {
1,866,148✔
1369
    if (createReq.igExists) {
23,145✔
1370
      if (createReq.source == TD_REQ_FROM_APP) {
21,883✔
1371
        mInfo("stb:%s, already exist, ignore exist is set", createReq.name);
7,396✔
1372
        code = 0;
7,396✔
1373
        goto _OVER;
7,396✔
1374
      } else if (pStb->uid != createReq.suid) {
14,487✔
1375
        mInfo("stb:%s, alter table does not need to be done, because table is deleted", createReq.name);
×
1376
        code = 0;
×
1377
        goto _OVER;
×
1378
      } else if (createReq.tagVer > 0 || createReq.colVer > 0) {
28,047✔
1379
        int32_t tagDelta = createReq.tagVer - pStb->tagVer;
14,487✔
1380
        int32_t colDelta = createReq.colVer - pStb->colVer;
14,487✔
1381
        mInfo("stb:%s, already exist while create, input tagVer:%d colVer:%d, exist tagVer:%d colVer:%d",
14,487✔
1382
              createReq.name, createReq.tagVer, createReq.colVer, pStb->tagVer, pStb->colVer);
1383
        if (tagDelta <= 0 && colDelta <= 0) {
14,487✔
1384
          mInfo("stb:%s, schema version is not incremented and nothing needs to be done", createReq.name);
927✔
1385
          code = 0;
927✔
1386
          goto _OVER;
927✔
1387
        } else if ((tagDelta == 1 && colDelta == 0) || (tagDelta == 0 && colDelta == 1) ||
13,560✔
1388
                   (pStb->colVer == 1 && createReq.colVer > 1) || (pStb->tagVer == 1 && createReq.tagVer > 1)) {
×
1389
          isAlter = true;
13,560✔
1390
          mInfo("stb:%s, schema version is only increased by 1 number, do alter operation", createReq.name);
13,560✔
1391
        } else {
1392
          mError("stb:%s, schema version increase more than 1 number, error is returned", createReq.name);
×
1393
          code = TSDB_CODE_MND_INVALID_SCHEMA_VER;
×
1394
          goto _OVER;
×
1395
        }
1396
      } else {
1397
        mError("stb:%s, already exist while create, input tagVer:%d colVer:%d is invalid, origin tagVer:%d colVer:%d",
×
1398
               createReq.name, createReq.tagVer, createReq.colVer, pStb->tagVer, pStb->colVer);
1399
        code = TSDB_CODE_MND_INVALID_SCHEMA_VER;
×
1400
        goto _OVER;
×
1401
      }
1402
    } else {
1403
      code = TSDB_CODE_MND_STB_ALREADY_EXIST;
1,262✔
1404
      goto _OVER;
1,262✔
1405
    }
1406
  } else if (terrno != TSDB_CODE_MND_STB_NOT_EXIST) {
1,843,003✔
1407
    goto _OVER;
×
1408
  } else if ((createReq.source == TD_REQ_FROM_TAOX_OLD || createReq.source == TD_REQ_FROM_TAOX || createReq.source == TD_REQ_FROM_SML) &&
1,843,003✔
1409
             (createReq.tagVer != 1 || createReq.colVer != 1)) {
859✔
1410
    mInfo("stb:%s, alter table does not need to be done, because table is deleted", createReq.name);
34✔
1411
    code = 0;
34✔
1412
    goto _OVER;
34✔
1413
  }
1414

1415
  pHash = taosHashInit(createReq.numOfColumns + createReq.numOfTags, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY),
1,856,529✔
1416
                       false, HASH_NO_LOCK);
1417
  if (pHash == NULL) {
1,856,529✔
1418
    code = TSDB_CODE_OUT_OF_MEMORY;
×
1419
    goto _OVER;
×
1420
  }
1421

1422
  for (int32_t i = 0; i < createReq.numOfColumns; ++i) {
137,958,976✔
1423
    SFieldWithOptions *pField = taosArrayGet(createReq.pColumns, i);
136,102,447✔
1424
    if ((code = taosHashPut(pHash, pField->name, strlen(pField->name), NULL, 0)) != 0) {
136,102,447✔
1425
      if (code == TSDB_CODE_DUP_KEY) {
×
1426
        code = TSDB_CODE_TSC_DUP_COL_NAMES;
×
1427
      }
1428
      goto _OVER;
×
1429
    }
1430
  }
1431

1432
  for (int32_t i = 0; i < createReq.numOfTags; ++i) {
9,274,703✔
1433
    SField *pField = taosArrayGet(createReq.pTags, i);
7,418,174✔
1434
    if ((code = taosHashPut(pHash, pField->name, strlen(pField->name), NULL, 0)) != 0) {
7,418,174✔
1435
      if (code == TSDB_CODE_DUP_KEY) {
×
1436
        code = TSDB_CODE_TSC_DUP_COL_NAMES;
×
1437
      }
1438
      goto _OVER;
×
1439
    }
1440
  }
1441

1442
  pDb = mndAcquireDbByStb(pMnode, createReq.name);
1,856,529✔
1443
  if (pDb == NULL) {
1,856,529✔
1444
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
1445
    goto _OVER;
×
1446
  }
1447

1448
  if ((code = mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_WRITE_DB, pDb)) != 0) {
1,856,529✔
1449
    goto _OVER;
×
1450
  }
1451
  if (pDb->cfg.isMount) {
1,856,529✔
1452
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
×
1453
    goto _OVER;
×
1454
  }
1455

1456
  int32_t numOfStbs = -1;
1,856,529✔
1457
  if ((code = mndGetNumOfStbs(pMnode, pDb->name, &numOfStbs)) != 0) {
1,856,529✔
1458
    goto _OVER;
×
1459
  }
1460

1461
  if (pDb->cfg.numOfStables == 1 && numOfStbs != 0) {
1,856,529✔
1462
    code = TSDB_CODE_MND_SINGLE_STB_MODE_DB;
×
1463
    goto _OVER;
×
1464
  }
1465

1466
  if ((code = grantCheck(TSDB_GRANT_STABLE)) < 0) {
1,856,529✔
1467
    goto _OVER;
×
1468
  }
1469

1470
  if (isAlter) {
1,856,529✔
1471
    bool    needRsp = false;
13,560✔
1472
    SStbObj pDst = {0};
13,560✔
1473
    if ((code = mndBuildStbFromAlter(pStb, &pDst, &createReq)) != 0) {
13,560✔
1474
      taosMemoryFreeClear(pDst.pTags);
×
1475
      taosMemoryFreeClear(pDst.pColumns);
×
1476
      taosMemoryFreeClear(pDst.pCmpr);
×
1477
      taosMemoryFreeClear(pDst.pExtSchemas);
×
1478
      goto _OVER;
×
1479
    }
1480
    void* buf = NULL;
13,560✔
1481
    int32_t contLen = 0;
13,560✔
1482
    buildAlterMsg(pStb, &pDst, &buf, &contLen);
13,560✔
1483
    code = mndAlterStbImp(pMnode, pReq, pDb, &pDst, needRsp, buf, contLen);
13,560✔
1484
    taosMemoryFree(buf);
13,560✔
1485
    taosMemoryFreeClear(pDst.pTags);
13,560✔
1486
    taosMemoryFreeClear(pDst.pColumns);
13,560✔
1487
    taosMemoryFreeClear(pDst.pCmpr);
13,560✔
1488
    taosMemoryFreeClear(pDst.pExtSchemas);
13,560✔
1489
  } else {
1490
    code = mndCreateStb(pMnode, pReq, &createReq, pDb);
1,842,969✔
1491
  }
1492
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
1,856,529✔
1493

1494
  SName name = {0};
1,856,529✔
1495
  TAOS_CHECK_RETURN(tNameFromString(&name, createReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
1,856,529✔
1496

1497
  if (createReq.sql == NULL && createReq.sqlLen == 0) {
1,856,529✔
1498
    char detail[1000] = {0};
330,654✔
1499

1500
    (void)tsnprintf(detail, sizeof(detail), "dbname:%s, stable name:%s", name.dbname, name.tname);
330,654✔
1501

1502
    auditRecord(pReq, pMnode->clusterId, "createStb", name.dbname, name.tname, detail, strlen(detail));
330,654✔
1503
  } else {
1504
    auditRecord(pReq, pMnode->clusterId, "createStb", name.dbname, name.tname, createReq.sql, createReq.sqlLen);
1,525,875✔
1505
  }
1506
_OVER:
1,866,148✔
1507
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
1,866,148✔
1508
    mError("stb:%s, failed to create since %s", createReq.name, tstrerror(code));
5,812✔
1509
  }
1510

1511
  mndReleaseStb(pMnode, pStb);
1,866,148✔
1512
  mndReleaseDb(pMnode, pDb);
1,866,148✔
1513
  tFreeSMCreateStbReq(&createReq);
1,866,148✔
1514

1515
  if (pHash != NULL) {
1,866,148✔
1516
    taosHashCleanup(pHash);
1,856,529✔
1517
  }
1518

1519
  TAOS_RETURN(code);
1,866,148✔
1520
}
1521

1522
static int32_t mndCheckAlterStbReq(SMAlterStbReq *pAlter) {
6,003,230✔
1523
  int32_t code = 0;
6,003,230✔
1524
  if (pAlter->commentLen >= 0) return 0;
6,003,230✔
1525
  if (pAlter->ttl != 0) return 0;
13,587✔
1526
  if (pAlter->keep != -1) return 0;
13,587✔
1527

1528
  if (pAlter->numOfFields < 1 || pAlter->numOfFields != (int32_t)taosArrayGetSize(pAlter->pFields)) {
×
1529
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
1530
    TAOS_RETURN(code);
×
1531
  }
1532

1533
  for (int32_t i = 0; i < pAlter->numOfFields; ++i) {
×
1534
    SField *pField = taosArrayGet(pAlter->pFields, i);
×
1535
    if (pField->name[0] == 0) {
×
1536
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
1537
      TAOS_RETURN(code);
×
1538
    }
1539
  }
1540

1541
  TAOS_RETURN(code);
×
1542
}
1543

1544
int32_t mndAllocStbSchemas(const SStbObj *pOld, SStbObj *pNew) {
5,729,579✔
1545
  pNew->pTags = taosMemoryCalloc(pNew->numOfTags, sizeof(SSchema));
5,729,579✔
1546
  pNew->pColumns = taosMemoryCalloc(pNew->numOfColumns, sizeof(SSchema));
5,729,579✔
1547
  pNew->pCmpr = taosMemoryCalloc(pNew->numOfColumns, sizeof(SColCmpr));
5,729,579✔
1548
  if (pNew->pTags == NULL || pNew->pColumns == NULL || pNew->pCmpr == NULL) {
5,729,579✔
1549
    TAOS_RETURN(terrno);
×
1550
  }
1551

1552
  memcpy(pNew->pColumns, pOld->pColumns, sizeof(SSchema) * pOld->numOfColumns);
5,729,579✔
1553
  memcpy(pNew->pTags, pOld->pTags, sizeof(SSchema) * pOld->numOfTags);
5,729,579✔
1554
  memcpy(pNew->pCmpr, pOld->pCmpr, sizeof(SColCmpr) * pOld->numOfColumns);
5,729,579✔
1555
  if (pOld->pExtSchemas) {
5,729,579✔
1556
    pNew->pExtSchemas = taosMemoryCalloc(pNew->numOfColumns, sizeof(SExtSchema));
4,675,919✔
1557
    if (pNew->pExtSchemas == NULL) {
4,675,919✔
1558
      TAOS_RETURN(terrno);
×
1559
    }
1560
    memcpy(pNew->pExtSchemas, pOld->pExtSchemas, sizeof(SExtSchema) * pOld->numOfColumns);
4,675,919✔
1561
  }
1562

1563
  TAOS_RETURN(0);
5,729,579✔
1564
}
1565

1566
static int32_t mndUpdateTableOptions(const SStbObj *pOld, SStbObj *pNew, char *pComment, int32_t commentLen,
22,654✔
1567
                                     int32_t ttl, int64_t keep) {
1568
  int32_t code = 0;
22,654✔
1569
  if (commentLen > 0) {
22,654✔
1570
    pNew->commentLen = commentLen;
4,810✔
1571
    pNew->comment = taosMemoryCalloc(1, commentLen + 1);
4,810✔
1572
    if (pNew->comment == NULL) {
4,810✔
1573
      terrno = TSDB_CODE_OUT_OF_MEMORY;
×
1574
      return -1;
×
1575
    }
1576
    memcpy(pNew->comment, pComment, commentLen + 1);
4,810✔
1577
  } else if (commentLen == 0) {
17,844✔
1578
    pNew->commentLen = 0;
4,257✔
1579
  } else {
1580
  }
1581

1582
  if (ttl >= 0) {
22,654✔
1583
    pNew->ttl = ttl;
22,654✔
1584
  }
1585

1586
  if (keep > 0) {
22,654✔
1587
    pNew->keep = keep;
13,587✔
1588
  }
1589

1590
  if ((code = mndAllocStbSchemas(pOld, pNew)) != 0) {
22,654✔
1591
    TAOS_RETURN(code);
×
1592
  }
1593
  TAOS_RETURN(code);
22,654✔
1594
}
1595

1596
static int32_t mndAddSuperTableTag(const SStbObj *pOld, SStbObj *pNew, SArray *pFields, int32_t ntags) {
319,569✔
1597
  int32_t code = 0;
319,569✔
1598
  if (pOld->numOfTags + ntags > TSDB_MAX_TAGS) {
319,569✔
1599
    code = TSDB_CODE_MND_TOO_MANY_TAGS;
×
1600
    TAOS_RETURN(code);
×
1601
  }
1602

1603
  int32_t maxColumns = pOld->virtualStb ? TSDB_MAX_COLUMNS : TSDB_MAX_COLUMNS_NON_VIRTUAL;
319,569✔
1604
  if (pOld->numOfColumns + ntags + pOld->numOfTags > maxColumns) {
319,569✔
1605
    code = TSDB_CODE_MND_TOO_MANY_COLUMNS;
×
1606
    TAOS_RETURN(code);
×
1607
  }
1608

1609
  if (!mndValidateSchema(pOld->pTags, pOld->numOfTags, pFields, TSDB_MAX_TAGS_LEN)) {
319,569✔
1610
    code = TSDB_CODE_PAR_INVALID_TAGS_LENGTH;
26,800✔
1611
    TAOS_RETURN(code);
26,800✔
1612
  }
1613

1614
  pNew->numOfTags = pNew->numOfTags + ntags;
292,769✔
1615
  if ((code = mndAllocStbSchemas(pOld, pNew)) != 0) {
292,769✔
1616
    TAOS_RETURN(code);
×
1617
  }
1618

1619
  if (pNew->nextColId < 0 || pNew->nextColId >= 0x7fff - ntags) {
292,769✔
1620
    code = TSDB_CODE_OUT_OF_RANGE;
964✔
1621
    TAOS_RETURN(code);
964✔
1622
  }
1623

1624
  for (int32_t i = 0; i < ntags; i++) {
513,980✔
1625
    SField *pField = taosArrayGet(pFields, i);
291,805✔
1626
    if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
291,805✔
1627
      code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
2,031✔
1628
      TAOS_RETURN(code);
2,031✔
1629
    }
1630

1631
    if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
289,774✔
1632
      code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
67,599✔
1633
      TAOS_RETURN(code);
67,599✔
1634
    }
1635

1636
    SSchema *pSchema = &pNew->pTags[pOld->numOfTags + i];
222,175✔
1637
    pSchema->bytes = pField->bytes;
222,175✔
1638
    pSchema->type = pField->type;
222,175✔
1639
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
222,175✔
1640
    if (pNew->nextColId > INT16_MAX) {
222,175✔
1641
      code = TSDB_CODE_MND_EXCEED_MAX_COL_ID;
×
1642
      TAOS_RETURN(code);
×
1643
    }
1644
    pSchema->colId = pNew->nextColId;
222,175✔
1645
    pNew->nextColId++;
222,175✔
1646

1647
    mInfo("stb:%s, start to add tag %s", pNew->name, pSchema->name);
222,175✔
1648
  }
1649

1650
  pNew->tagVer++;
222,175✔
1651
  TAOS_RETURN(code);
222,175✔
1652
}
1653

1654
static int32_t mndCheckAlterColForTSma(SMnode *pMnode, const char *stbFullName, int64_t suid, col_id_t colId, bool isTag) {
2,687,291✔
1655
  int32_t code = 0;
2,687,291✔
1656
  SSdb   *pSdb = pMnode->pSdb;
2,687,291✔
1657
  void   *pIter = NULL;
2,687,291✔
1658
  while (1) {
×
1659
    SSmaObj *pSma = NULL;
2,687,291✔
1660
    pIter = sdbFetch(pSdb, SDB_SMA, pIter, (void **)&pSma);
2,687,291✔
1661
    if (pIter == NULL) break;
2,687,291✔
1662

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

1666
    if (isTag) {
×
1667
      code = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TSMA;
×
1668
      mError("tsma:%s, check tag:%d conflicted", pSma->name, colId);
×
1669
      sdbRelease(pSdb, pSma);
×
1670
      sdbCancelFetch(pSdb, pIter);
×
1671
      TAOS_RETURN(code);
×
1672
    }
1673

1674
    SNode *pAst = NULL;
×
1675
    if (nodesStringToNode(pSma->ast, &pAst) != 0) {
×
1676
      code = TSDB_CODE_SDB_INVALID_DATA_CONTENT;
×
1677
      mError("tsma:%s, check tag and column modifiable, stb:%s suid:%" PRId64 " colId:%d failed since parse AST err",
×
1678
             pSma->name, stbFullName, suid, colId);
1679
      sdbCancelFetch(pSdb, pIter);
×
1680
      TAOS_RETURN(code);
×
1681
    }
1682

1683
    SNodeList *pNodeList = NULL;
×
1684
    if ((code = nodesCollectColumns((SSelectStmt *)pAst, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pNodeList)) !=
×
1685
        0) {
1686
      sdbCancelFetch(pSdb, pIter);
×
1687
      TAOS_RETURN(code);
×
1688
    }
1689
    SNode *pNode = NULL;
×
1690
    FOREACH(pNode, pNodeList) {
×
1691
      SColumnNode *pCol = (SColumnNode *)pNode;
×
1692
      mInfo("tsma:%s, check colId:%d tableId:%" PRId64, pSma->name, pCol->colId, pCol->tableId);
×
1693

1694
      if ((pCol->tableId != suid) && (pSma->stbUid != suid)) {
×
1695
        mInfo("tsma:%s, check colId:%d passed", pSma->name, pCol->colId);
×
1696
        goto NEXT;
×
1697
      }
1698
      if ((pCol->colId) > 0 && (pCol->colId == colId)) {
×
1699
        code = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TSMA;
×
1700
        mError("tsma:%s, check colId:%d conflicted", pSma->name, pCol->colId);
×
1701
        nodesDestroyNode(pAst);
×
1702
        nodesDestroyList(pNodeList);
×
1703
        sdbRelease(pSdb, pSma);
×
1704
        sdbCancelFetch(pSdb, pIter);
×
1705
        TAOS_RETURN(code);
×
1706
      }
1707
      mInfo("tsma:%s, check colId:%d passed", pSma->name, pCol->colId);
×
1708
    }
1709

1710
  NEXT:
×
1711
    sdbRelease(pSdb, pSma);
×
1712
    nodesDestroyNode(pAst);
×
1713
    nodesDestroyList(pNodeList);
×
1714
  }
1715
  TAOS_RETURN(code);
2,687,291✔
1716
}
1717

1718
static int32_t mndDropSuperTableTag(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const char *tagName) {
141,852✔
1719
  int32_t code = 0;
141,852✔
1720
  int32_t tag = mndFindSuperTableTagIndex(pOld, tagName);
141,852✔
1721
  if (tag < 0) {
141,852✔
1722
    code = TSDB_CODE_MND_TAG_NOT_EXIST;
×
1723
    TAOS_RETURN(code);
×
1724
  }
1725

1726
  col_id_t colId = pOld->pTags[tag].colId;
141,852✔
1727
  TAOS_CHECK_RETURN(mndCheckAlterColForTSma(pMnode, pOld->name, pOld->uid, colId, true));
141,852✔
1728

1729
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
141,852✔
1730

1731
  memmove(pNew->pTags + tag, pNew->pTags + tag + 1, sizeof(SSchema) * (pNew->numOfTags - tag - 1));
141,852✔
1732
  pNew->numOfTags--;
141,852✔
1733

1734
  pNew->tagVer++;
141,852✔
1735

1736
  // if (mndDropIndexByTag(pMnode, pOld, tagName) != 0) {
1737
  //   return -1;
1738
  // }
1739
  mInfo("stb:%s, start to drop tag %s", pNew->name, tagName);
141,852✔
1740
  TAOS_RETURN(code);
141,852✔
1741
}
1742

1743
static int32_t mndAlterStbTagName(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, SArray *pFields) {
206,211✔
1744
  int32_t code = 0;
206,211✔
1745
  if ((int32_t)taosArrayGetSize(pFields) != 2) {
206,211✔
1746
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
1747
    TAOS_RETURN(code);
×
1748
  }
1749

1750
  SField *pField0 = taosArrayGet(pFields, 0);
206,211✔
1751
  SField *pField1 = taosArrayGet(pFields, 1);
206,211✔
1752

1753
  const char *oldTagName = pField0->name;
206,211✔
1754
  const char *newTagName = pField1->name;
206,211✔
1755

1756
  int32_t tag = mndFindSuperTableTagIndex(pOld, oldTagName);
206,211✔
1757
  if (tag < 0) {
206,211✔
1758
    code = TSDB_CODE_MND_TAG_NOT_EXIST;
3,374✔
1759
    TAOS_RETURN(code);
3,374✔
1760
  }
1761

1762
  col_id_t colId = pOld->pTags[tag].colId;
202,837✔
1763
  TAOS_CHECK_RETURN(mndCheckAlterColForTSma(pMnode, pOld->name, pOld->uid, colId, true));
202,837✔
1764

1765
  if (mndFindSuperTableTagIndex(pOld, newTagName) >= 0) {
202,837✔
1766
    code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
6,048✔
1767
    TAOS_RETURN(code);
6,048✔
1768
  }
1769

1770
  if (mndFindSuperTableColumnIndex(pOld, newTagName) >= 0) {
196,789✔
1771
    code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
×
1772
    TAOS_RETURN(code);
×
1773
  }
1774

1775
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
196,789✔
1776

1777
  SSchema *pSchema = (SSchema *)(pNew->pTags + tag);
196,789✔
1778
  memcpy(pSchema->name, newTagName, TSDB_COL_NAME_LEN);
196,789✔
1779

1780
  pNew->tagVer++;
196,789✔
1781
  mInfo("stb:%s, start to modify tag %s to %s", pNew->name, oldTagName, newTagName);
196,789✔
1782
  TAOS_RETURN(code);
196,789✔
1783
}
1784

1785
static int32_t mndAlterStbTagBytes(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const SField *pField) {
328,800✔
1786
  int32_t code = 0;
328,800✔
1787
  int32_t tag = mndFindSuperTableTagIndex(pOld, pField->name);
328,800✔
1788
  if (tag < 0) {
328,800✔
1789
    code = TSDB_CODE_MND_TAG_NOT_EXIST;
×
1790
    TAOS_RETURN(code);
×
1791
  }
1792

1793
  col_id_t colId = pOld->pTags[tag].colId;
328,800✔
1794
  TAOS_CHECK_RETURN(mndCheckAlterColForTSma(pMnode, pOld->name, pOld->uid, colId, true));
328,800✔
1795

1796
  uint32_t nLen = 0;
328,800✔
1797
  for (int32_t i = 0; i < pOld->numOfTags; ++i) {
13,211,711✔
1798
    nLen += (pOld->pTags[i].colId == colId) ? pField->bytes : pOld->pTags[i].bytes;
12,882,911✔
1799
  }
1800

1801
  if (nLen > TSDB_MAX_TAGS_LEN) {
328,800✔
1802
    code = TSDB_CODE_PAR_INVALID_TAGS_LENGTH;
189,610✔
1803
    TAOS_RETURN(code);
189,610✔
1804
  }
1805

1806
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
139,190✔
1807

1808
  SSchema *pTag = pNew->pTags + tag;
139,190✔
1809

1810
  if (!(pTag->type == TSDB_DATA_TYPE_BINARY || pTag->type == TSDB_DATA_TYPE_VARBINARY ||
139,190✔
1811
        pTag->type == TSDB_DATA_TYPE_NCHAR || pTag->type == TSDB_DATA_TYPE_GEOMETRY)) {
134,955✔
1812
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
1813
    TAOS_RETURN(code);
×
1814
  }
1815

1816
  if (pField->bytes <= pTag->bytes) {
139,190✔
1817
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
40,200✔
1818
    TAOS_RETURN(code);
40,200✔
1819
  }
1820

1821
  pTag->bytes = pField->bytes;
98,990✔
1822
  pNew->tagVer++;
98,990✔
1823

1824
  mInfo("stb:%s, start to modify tag len %s to %d", pNew->name, pField->name, pField->bytes);
98,990✔
1825
  TAOS_RETURN(code);
98,990✔
1826
}
1827

1828
static int32_t mndUpdateSuperTableColumnCompress(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, SArray *pField,
96,138✔
1829
                                                 int32_t nCols) {
1830
  // if (pColCmpr == NULL || colName == NULL) return -1;
1831

1832
  if (taosArrayGetSize(pField) != nCols) return TSDB_CODE_FAILED;
96,138✔
1833
  TAOS_FIELD *p = taosArrayGet(pField, 0);
96,138✔
1834

1835
  int32_t code = 0;
96,138✔
1836
  int32_t idx = mndFindSuperTableColumnIndex(pOld, p->name);
96,138✔
1837
  if (idx == -1) {
96,138✔
1838
    code = TSDB_CODE_MND_COLUMN_NOT_EXIST;
×
1839
    TAOS_RETURN(code);
×
1840
  }
1841
  SSchema *pTarget = &pOld->pColumns[idx];
96,138✔
1842
  col_id_t colId = pTarget->colId;
96,138✔
1843

1844
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
96,138✔
1845
  code = validColCmprByType(pTarget->type, p->bytes);
96,138✔
1846
  if (code != TSDB_CODE_SUCCESS) {
96,138✔
1847
    TAOS_RETURN(code);
2,320✔
1848
  }
1849

1850
  int8_t updated = 0;
93,818✔
1851
  for (int i = 0; i < pNew->numOfColumns; i++) {
795,474✔
1852
    SColCmpr *pCmpr = &pNew->pCmpr[i];
795,474✔
1853
    if (pCmpr->id == colId) {
795,474✔
1854
      uint32_t dst = 0;
93,818✔
1855
      updated = tUpdateCompress(pCmpr->alg, p->bytes, TSDB_COLVAL_COMPRESS_DISABLED, TSDB_COLVAL_LEVEL_DISABLED,
93,818✔
1856
                                TSDB_COLVAL_LEVEL_MEDIUM, &dst);
1857
      if (updated > 0) pCmpr->alg = dst;
93,818✔
1858
      break;
93,818✔
1859
    }
1860
  }
1861

1862
  if (updated == 0) {
93,818✔
1863
    code = TSDB_CODE_MND_COLUMN_COMPRESS_ALREADY_EXIST;
8,302✔
1864
    TAOS_RETURN(code);
8,302✔
1865
  } else if (updated == -1) {
85,516✔
1866
    code = TSDB_CODE_TSC_COMPRESS_LEVEL_ERROR;
×
1867
    TAOS_RETURN(code);
×
1868
  }
1869

1870
  pNew->colVer++;
85,516✔
1871

1872
  TAOS_RETURN(code);
85,516✔
1873
}
1874
static int32_t mndAddSuperTableColumn(const SStbObj *pOld, SStbObj *pNew, const SMAlterStbReq* pReq, int32_t ncols,
2,827,884✔
1875
                                      int8_t withCompress) {
1876
  int32_t code = 0;
2,827,884✔
1877
  int32_t maxColumns = pOld->virtualStb ? TSDB_MAX_COLUMNS : TSDB_MAX_COLUMNS_NON_VIRTUAL;
2,827,884✔
1878
  int32_t maxBytesPerRow = pOld->virtualStb ? TSDB_MAX_BYTES_PER_ROW_VIRTUAL : TSDB_MAX_BYTES_PER_ROW;
2,827,884✔
1879
  if (pOld->numOfColumns + ncols + pOld->numOfTags > maxColumns) {
2,827,884✔
1880
    code = TSDB_CODE_MND_TOO_MANY_COLUMNS;
×
1881
    TAOS_RETURN(code);
×
1882
  }
1883

1884
  if ((code = grantCheck(TSDB_GRANT_TIMESERIES)) != 0) {
2,827,884✔
1885
    TAOS_RETURN(code);
×
1886
  }
1887

1888
  if (!mndValidateSchema(pOld->pColumns, pOld->numOfColumns, pReq->pFields, maxBytesPerRow)) {
2,827,884✔
1889
    code = TSDB_CODE_PAR_INVALID_ROW_LENGTH;
6,700✔
1890
    TAOS_RETURN(code);
6,700✔
1891
  }
1892

1893
  pNew->numOfColumns = pNew->numOfColumns + ncols;
2,821,184✔
1894

1895
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
2,821,184✔
1896

1897
  if (pNew->nextColId < 0 || pNew->nextColId >= 0x7fff - ncols) {
2,821,184✔
1898
    code = TSDB_CODE_OUT_OF_RANGE;
964✔
1899
    TAOS_RETURN(code);
964✔
1900
  }
1901

1902
  for (int32_t i = 0; i < ncols; i++) {
5,312,883✔
1903
    if (withCompress) {
2,820,220✔
1904
      SFieldWithOptions *pField = taosArrayGet(pReq->pFields, i);
262,032✔
1905
      if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
262,032✔
1906
        code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
×
1907
        TAOS_RETURN(code);
×
1908
      }
1909

1910
      if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
262,032✔
1911
        code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
×
1912
        TAOS_RETURN(code);
×
1913
      }
1914

1915
      SSchema *pSchema = &pNew->pColumns[pOld->numOfColumns + i];
262,032✔
1916
      pSchema->bytes = pField->bytes;
262,032✔
1917
      pSchema->type = pField->type;
262,032✔
1918
      memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
262,032✔
1919
      if (pNew->nextColId > INT16_MAX) {
262,032✔
1920
        code = TSDB_CODE_MND_EXCEED_MAX_COL_ID;
×
1921
        TAOS_RETURN(code);
×
1922
      }
1923
      pSchema->colId = pNew->nextColId;
262,032✔
1924
      pNew->nextColId++;
262,032✔
1925

1926
      SColCmpr *pCmpr = &pNew->pCmpr[pOld->numOfColumns + i];
262,032✔
1927
      pCmpr->id = pSchema->colId;
262,032✔
1928
      pCmpr->alg = pField->compress;
262,032✔
1929
      mInfo("stb:%s, start to add column %s", pNew->name, pSchema->name);
262,032✔
1930
    } else {
1931
      SField *pField = taosArrayGet(pReq->pFields, i);
2,558,188✔
1932
      if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
2,558,188✔
1933
        code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
325,526✔
1934
        TAOS_RETURN(code);
325,526✔
1935
      }
1936

1937
      if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
2,232,662✔
1938
        code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
2,031✔
1939
        TAOS_RETURN(code);
2,031✔
1940
      }
1941

1942
      SSchema *pSchema = &pNew->pColumns[pOld->numOfColumns + i];
2,230,631✔
1943
      pSchema->bytes = pField->bytes;
2,230,631✔
1944
      pSchema->type = pField->type;
2,230,631✔
1945
      memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
2,230,631✔
1946
      if (pNew->nextColId > INT16_MAX) {
2,230,631✔
1947
        code = TSDB_CODE_MND_EXCEED_MAX_COL_ID;
×
1948
        TAOS_RETURN(code);
×
1949
      }
1950
      pSchema->colId = pNew->nextColId;
2,230,631✔
1951
      pNew->nextColId++;
2,230,631✔
1952

1953
      SColCmpr *pCmpr = &pNew->pCmpr[pOld->numOfColumns + i];
2,230,631✔
1954
      pCmpr->id = pSchema->colId;
2,230,631✔
1955
      pCmpr->alg = createDefaultColCmprByType(pSchema->type);
2,230,631✔
1956
      mInfo("stb:%s, start to add column %s", pNew->name, pSchema->name);
2,230,631✔
1957
    }
1958
  }
1959
  // 1. old schema already has extschemas
1960
  // 2. new schema has extschemas
1961
  if (pReq->pTypeMods || pOld->pExtSchemas) {
2,492,663✔
1962
    if (!pNew->pExtSchemas) {
2,492,663✔
1963
      // all ext schemas reset to zero
1964
      pNew->pExtSchemas = taosMemoryCalloc(pNew->numOfColumns, sizeof(SExtSchema));
29,816✔
1965
      if (!pNew->pExtSchemas) TAOS_RETURN(terrno);
29,816✔
1966
    }
1967
    if (pOld->pExtSchemas) {
2,492,663✔
1968
      memcpy(pNew->pExtSchemas, pOld->pExtSchemas, pOld->numOfColumns * sizeof(SExtSchema));
2,462,847✔
1969
    }
1970
    if (taosArrayGetSize(pReq->pTypeMods) > 0) {
2,492,663✔
1971
      // copy added column ext schema
1972
      for (int32_t i = 0; i < ncols; ++i) {
4,985,326✔
1973
        pNew->pColumns[pOld->numOfColumns + i].flags |= COL_HAS_TYPE_MOD;
2,492,663✔
1974
        pNew->pExtSchemas[pOld->numOfColumns + i].typeMod = *(STypeMod *)taosArrayGet(pReq->pTypeMods, i);
2,492,663✔
1975
      }
1976
    }
1977
  }
1978

1979
  pNew->colVer++;
2,492,663✔
1980
  TAOS_RETURN(code);
2,492,663✔
1981
}
1982

1983
static int32_t mndDropSuperTableColumn(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const char *colName) {
1,543,382✔
1984
  int32_t code = 0;
1,543,382✔
1985
  int32_t col = mndFindSuperTableColumnIndex(pOld, colName);
1,543,382✔
1986
  if (col < 0) {
1,543,382✔
1987
    code = TSDB_CODE_MND_COLUMN_NOT_EXIST;
2,031✔
1988
    TAOS_RETURN(code);
2,031✔
1989
  }
1990

1991
  if (col == 0) {
1,541,351✔
1992
    code = TSDB_CODE_MND_INVALID_STB_ALTER_OPTION;
1,439✔
1993
    TAOS_RETURN(code);
1,439✔
1994
  }
1995

1996
  if (pOld->numOfColumns == 2) {
1,539,912✔
1997
    code = TSDB_CODE_PAR_INVALID_DROP_COL;
×
1998
    TAOS_RETURN(code);
×
1999
  }
2000

2001
  col_id_t colId = pOld->pColumns[col].colId;
1,539,912✔
2002
  TAOS_CHECK_RETURN(mndCheckAlterColForTSma(pMnode, pOld->name, pOld->uid, colId, false));
1,539,912✔
2003

2004
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
1,539,912✔
2005

2006
  int32_t sz = pNew->numOfColumns - col - 1;
1,539,912✔
2007
  memmove(pNew->pColumns + col, pNew->pColumns + col + 1, sizeof(SSchema) * sz);
1,539,912✔
2008
  memmove(pNew->pCmpr + col, pNew->pCmpr + col + 1, sizeof(SColCmpr) * sz);
1,539,912✔
2009
  if (pOld->pExtSchemas) {
1,539,912✔
2010
    memmove(pNew->pExtSchemas + col, pNew->pExtSchemas + col + 1, sizeof(SExtSchema) * sz);
1,523,962✔
2011
  }
2012
  pNew->numOfColumns--;
1,539,912✔
2013

2014
  pNew->colVer++;
1,539,912✔
2015
  mInfo("stb:%s, start to drop col %s", pNew->name, colName);
1,539,912✔
2016
  TAOS_RETURN(code);
1,539,912✔
2017
}
2018

2019
static int32_t mndAlterStbColumnBytes(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const SField *pField) {
501,360✔
2020
  int32_t code = 0;
501,360✔
2021
  int32_t col = mndFindSuperTableColumnIndex(pOld, pField->name);
501,360✔
2022
  if (col < 0) {
501,360✔
2023
    code = TSDB_CODE_MND_COLUMN_NOT_EXIST;
×
2024
    TAOS_RETURN(code);
×
2025
  }
2026

2027
  col_id_t colId = pOld->pColumns[col].colId;
501,360✔
2028

2029
  uint32_t nLen = 0;
501,360✔
2030
  int32_t  maxBytesPerRow = pOld->virtualStb ? TSDB_MAX_BYTES_PER_ROW_VIRTUAL : TSDB_MAX_BYTES_PER_ROW;
501,360✔
2031
  for (int32_t i = 0; i < pOld->numOfColumns; ++i) {
36,392,465✔
2032
    nLen += (pOld->pColumns[i].colId == colId) ? pField->bytes : pOld->pColumns[i].bytes;
35,891,105✔
2033
  }
2034

2035
  if (nLen > maxBytesPerRow) {
501,360✔
2036
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
27,470✔
2037
    TAOS_RETURN(code);
27,470✔
2038
  }
2039

2040
  TAOS_CHECK_RETURN(mndCheckAlterColForTSma(pMnode, pOld->name, pOld->uid, colId, false));
473,890✔
2041

2042
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
473,890✔
2043

2044
  SSchema *pCol = pNew->pColumns + col;
473,890✔
2045
  if (!(pCol->type == TSDB_DATA_TYPE_BINARY || pCol->type == TSDB_DATA_TYPE_VARBINARY ||
473,890✔
2046
        pCol->type == TSDB_DATA_TYPE_NCHAR || pCol->type == TSDB_DATA_TYPE_GEOMETRY)) {
465,865✔
2047
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
2048
    TAOS_RETURN(code);
×
2049
  }
2050

2051
  if (pField->bytes <= pCol->bytes) {
473,890✔
2052
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
186,260✔
2053
    TAOS_RETURN(code);
186,260✔
2054
  }
2055

2056
  pCol->bytes = pField->bytes;
287,630✔
2057
  pNew->colVer++;
287,630✔
2058

2059
  mInfo("stb:%s, start to modify col len %s to %d", pNew->name, pField->name, pField->bytes);
287,630✔
2060
  TAOS_RETURN(code);
287,630✔
2061
}
2062

2063
static int32_t mndSetAlterStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
5,009,281✔
2064
  int32_t  code = 0;
5,009,281✔
2065
  SSdbRaw *pRedoRaw = mndStbActionEncode(pStb);
5,009,281✔
2066
  if (pRedoRaw == NULL) {
5,009,281✔
2067
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2068
    if (terrno != 0) code = terrno;
×
2069
    TAOS_RETURN(code);
×
2070
  }
2071
  if ((code = mndTransAppendPrepareLog(pTrans, pRedoRaw)) != 0) {
5,009,281✔
2072
    sdbFreeRaw(pRedoRaw);
×
2073
    TAOS_RETURN(code);
×
2074
  }
2075
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY));
5,009,281✔
2076

2077
  TAOS_RETURN(code);
5,009,281✔
2078
}
2079

2080
static int32_t mndSetAlterStbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
5,009,281✔
2081
  int32_t  code = 0;
5,009,281✔
2082
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
5,009,281✔
2083
  if (pCommitRaw == NULL) {
5,009,281✔
2084
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2085
    if (terrno != 0) code = terrno;
×
2086
    TAOS_RETURN(code);
×
2087
  }
2088
  if ((code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
5,009,281✔
2089
    sdbFreeRaw(pCommitRaw);
×
2090
    TAOS_RETURN(code);
×
2091
  }
2092
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
5,009,281✔
2093

2094
  TAOS_RETURN(code);
5,009,281✔
2095
}
2096

2097
static int32_t mndSetAlterStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb, void *alterOriData,
5,009,281✔
2098
                                         int32_t alterOriDataLen) {
2099
  int32_t code = 0;
5,009,281✔
2100
  SSdb   *pSdb = pMnode->pSdb;
5,009,281✔
2101
  SVgObj *pVgroup = NULL;
5,009,281✔
2102
  void   *pIter = NULL;
5,009,281✔
2103
  int32_t contLen;
5,009,281✔
2104

2105
  while (1) {
11,806,811✔
2106
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
16,816,092✔
2107
    if (pIter == NULL) break;
16,816,092✔
2108
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
11,806,811✔
2109
      sdbRelease(pSdb, pVgroup);
4,750,752✔
2110
      continue;
4,750,752✔
2111
    }
2112

2113
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, alterOriData, alterOriDataLen);
7,056,059✔
2114
    if (pReq == NULL) {
7,056,059✔
2115
      sdbCancelFetch(pSdb, pIter);
×
2116
      sdbRelease(pSdb, pVgroup);
×
2117
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2118
      if (terrno != 0) code = terrno;
×
2119
      TAOS_RETURN(code);
×
2120
    }
2121
    STransAction action = {0};
7,056,059✔
2122
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
7,056,059✔
2123
    action.pCont = pReq;
7,056,059✔
2124
    action.contLen = contLen;
7,056,059✔
2125
    action.msgType = TDMT_VND_ALTER_STB;
7,056,059✔
2126
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
7,056,059✔
2127
      taosMemoryFree(pReq);
×
2128
      sdbCancelFetch(pSdb, pIter);
×
2129
      sdbRelease(pSdb, pVgroup);
×
2130
      TAOS_RETURN(code);
×
2131
    }
2132
    sdbRelease(pSdb, pVgroup);
7,056,059✔
2133
  }
2134

2135
  TAOS_RETURN(code);
5,009,281✔
2136
}
2137

2138
static int32_t mndSetAlterStbRedoActions2(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb,
×
2139
                                          void *alterOriData, int32_t alterOriDataLen) {
2140
  int32_t code = 0;
×
2141
  SSdb   *pSdb = pMnode->pSdb;
×
2142
  SVgObj *pVgroup = NULL;
×
2143
  void   *pIter = NULL;
×
2144
  int32_t contLen;
×
2145

2146
  while (1) {
×
2147
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
×
2148
    if (pIter == NULL) break;
×
2149
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
×
2150
      sdbRelease(pSdb, pVgroup);
×
2151
      continue;
×
2152
    }
2153

2154
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, alterOriData, alterOriDataLen);
×
2155
    if (pReq == NULL) {
×
2156
      sdbCancelFetch(pSdb, pIter);
×
2157
      sdbRelease(pSdb, pVgroup);
×
2158
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2159
      if (terrno != 0) code = terrno;
×
2160
      TAOS_RETURN(code);
×
2161
    }
2162
    STransAction action = {0};
×
2163
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
×
2164
    action.pCont = pReq;
×
2165
    action.contLen = contLen;
×
2166
    action.msgType = TDMT_VND_CREATE_INDEX;
×
2167
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
×
2168
      taosMemoryFree(pReq);
×
2169
      sdbCancelFetch(pSdb, pIter);
×
2170
      sdbRelease(pSdb, pVgroup);
×
2171
      TAOS_RETURN(code);
×
2172
    }
2173
    sdbRelease(pSdb, pVgroup);
×
2174
  }
2175

2176
  TAOS_RETURN(code);
×
2177
}
2178

2179
static int32_t mndBuildStbSchemaImp(SMnode *pMnode, SDbObj *pDb, SStbObj *pStb, const char *tbName, STableMetaRsp *pRsp, bool refByStm) {
21,843,070✔
2180
  int32_t code = 0;
21,843,070✔
2181
  taosRLockLatch(&pStb->lock);
21,843,070✔
2182

2183
  int32_t totalCols = pStb->numOfColumns + pStb->numOfTags;
21,843,070✔
2184
  pRsp->pSchemas = taosMemoryCalloc(totalCols, sizeof(SSchema));
21,843,070✔
2185
  if (pRsp->pSchemas == NULL) {
21,843,070✔
2186
    taosRUnLockLatch(&pStb->lock);
×
2187
    code = terrno;
×
2188
    TAOS_RETURN(code);
×
2189
  }
2190
  pRsp->pSchemaExt = taosMemoryCalloc(pStb->numOfColumns, sizeof(SSchemaExt));
21,843,070✔
2191
  if (pRsp->pSchemaExt == NULL) {
21,843,070✔
2192
    taosRUnLockLatch(&pStb->lock);
×
2193
    code = terrno;
×
2194
    TAOS_RETURN(code);
×
2195
  }
2196
  pRsp->numOfColRefs = 0;
21,843,070✔
2197
  pRsp->pColRefs = NULL;
21,843,070✔
2198
  tstrncpy(pRsp->dbFName, pStb->db, sizeof(pRsp->dbFName));
21,843,070✔
2199
  tstrncpy(pRsp->tbName, tbName, sizeof(pRsp->tbName));
21,843,070✔
2200
  tstrncpy(pRsp->stbName, tbName, sizeof(pRsp->stbName));
21,843,070✔
2201
  pRsp->dbId = pDb->uid;
21,843,070✔
2202
  pRsp->numOfTags = pStb->numOfTags;
21,843,070✔
2203
  pRsp->numOfColumns = pStb->numOfColumns;
21,843,070✔
2204
  pRsp->precision = pDb->cfg.precision;
21,843,070✔
2205
  pRsp->tableType = TSDB_SUPER_TABLE;
21,843,070✔
2206
  pRsp->sversion = pStb->colVer;
21,843,070✔
2207
  pRsp->tversion = pStb->tagVer;
21,843,070✔
2208
  pRsp->suid = pStb->uid;
21,843,070✔
2209
  pRsp->tuid = pStb->uid;
21,843,070✔
2210
  pRsp->virtualStb = pStb->virtualStb;
21,843,070✔
2211

2212
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
782,284,377✔
2213
    SSchema *pSchema = &pRsp->pSchemas[i];
760,441,307✔
2214
    SSchema *pSrcSchema = &pStb->pColumns[i];
760,441,307✔
2215
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
760,441,307✔
2216
    pSchema->type = pSrcSchema->type;
760,441,977✔
2217
    pSchema->flags = pSrcSchema->flags;
760,440,637✔
2218
    pSchema->colId = pSrcSchema->colId;
760,441,307✔
2219
    pSchema->bytes = pSrcSchema->bytes;
760,441,307✔
2220
  }
2221
  
2222
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
110,127,510✔
2223
    SSchema *pSchema = &pRsp->pSchemas[i + pStb->numOfColumns];
88,284,440✔
2224
    SSchema *pSrcSchema = &pStb->pTags[i];
88,284,440✔
2225
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
88,285,110✔
2226
    pSchema->type = pSrcSchema->type;
88,285,110✔
2227
    pSchema->flags = pSrcSchema->flags;
88,286,450✔
2228
    pSchema->colId = pSrcSchema->colId;
88,285,780✔
2229
    pSchema->bytes = pSrcSchema->bytes;
88,285,780✔
2230
  }
2231

2232
  if (refByStm) {
21,843,070✔
2233
    mndStreamUpdateTagsRefFlag(pMnode, pStb->uid, &pRsp->pSchemas[pStb->numOfColumns], pStb->numOfTags);
14,996,773✔
2234
  }
2235

2236
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
782,290,407✔
2237
    SColCmpr   *pCmpr = &pStb->pCmpr[i];
760,447,337✔
2238
    SSchemaExt *pSchEx = &pRsp->pSchemaExt[i];
760,447,337✔
2239
    pSchEx->colId = pCmpr->id;
760,447,337✔
2240
    pSchEx->compress = pCmpr->alg;
760,447,337✔
2241
    if (pStb->pExtSchemas) {
760,447,337✔
2242
      pSchEx->typeMod = pStb->pExtSchemas[i].typeMod;
483,673,382✔
2243
    }
2244
  }
2245

2246
  taosRUnLockLatch(&pStb->lock);
21,843,070✔
2247
  TAOS_RETURN(code);
21,843,070✔
2248
}
2249

2250
static int32_t mndBuildStbCfgImp(SDbObj *pDb, SStbObj *pStb, const char *tbName, STableCfgRsp *pRsp) {
46,882✔
2251
  int32_t code = 0;
46,882✔
2252
  taosRLockLatch(&pStb->lock);
46,882✔
2253

2254
  int32_t totalCols = pStb->numOfColumns + pStb->numOfTags;
46,882✔
2255
  pRsp->pSchemas = taosMemoryCalloc(totalCols, sizeof(SSchema));
46,882✔
2256
  if (pRsp->pSchemas == NULL) {
46,882✔
2257
    taosRUnLockLatch(&pStb->lock);
×
2258
    code = terrno;
×
2259
    TAOS_RETURN(code);
×
2260
  }
2261

2262
  tstrncpy(pRsp->dbFName, pStb->db, sizeof(pRsp->dbFName));
46,882✔
2263
  tstrncpy(pRsp->tbName, tbName, sizeof(pRsp->tbName));
46,882✔
2264
  tstrncpy(pRsp->stbName, tbName, sizeof(pRsp->stbName));
46,882✔
2265
  pRsp->numOfTags = pStb->numOfTags;
46,882✔
2266
  pRsp->numOfColumns = pStb->numOfColumns;
46,882✔
2267
  pRsp->tableType = TSDB_SUPER_TABLE;
46,882✔
2268
  pRsp->delay1 = pStb->maxdelay[0];
46,882✔
2269
  pRsp->delay2 = pStb->maxdelay[1];
46,882✔
2270
  pRsp->watermark1 = pStb->watermark[0];
46,882✔
2271
  pRsp->watermark2 = pStb->watermark[1];
46,882✔
2272
  pRsp->ttl = pStb->ttl;
46,882✔
2273
  pRsp->keep = pStb->keep;
46,882✔
2274
  pRsp->commentLen = pStb->commentLen;
46,882✔
2275
  if (pStb->commentLen > 0) {
46,882✔
2276
    pRsp->pComment = taosStrdup(pStb->comment);
×
2277
  }
2278

2279
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
407,996✔
2280
    SSchema *pSchema = &pRsp->pSchemas[i];
361,114✔
2281
    SSchema *pSrcSchema = &pStb->pColumns[i];
361,114✔
2282
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
361,114✔
2283
    pSchema->type = pSrcSchema->type;
361,114✔
2284
    pSchema->flags = pSrcSchema->flags;
361,114✔
2285
    pSchema->colId = pSrcSchema->colId;
361,114✔
2286
    pSchema->bytes = pSrcSchema->bytes;
361,114✔
2287
  }
2288

2289
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
262,537✔
2290
    SSchema *pSchema = &pRsp->pSchemas[i + pStb->numOfColumns];
215,655✔
2291
    SSchema *pSrcSchema = &pStb->pTags[i];
215,655✔
2292
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
215,655✔
2293
    pSchema->type = pSrcSchema->type;
215,655✔
2294
    pSchema->flags = pSrcSchema->flags;
215,655✔
2295
    pSchema->colId = pSrcSchema->colId;
215,655✔
2296
    pSchema->bytes = pSrcSchema->bytes;
215,655✔
2297
  }
2298

2299
  if (pStb->numOfFuncs > 0) {
46,882✔
2300
    pRsp->pFuncs = taosArrayDup(pStb->pFuncs, NULL);
×
2301
  }
2302

2303
  pRsp->pSchemaExt = taosMemoryCalloc(pStb->numOfColumns, sizeof(SSchemaExt));
46,882✔
2304
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
407,996✔
2305
    SColCmpr *pCmpr = &pStb->pCmpr[i];
361,114✔
2306

2307
    SSchemaExt *pSchExt = &pRsp->pSchemaExt[i];
361,114✔
2308
    pSchExt->colId = pCmpr->id;
361,114✔
2309
    pSchExt->compress = pCmpr->alg;
361,114✔
2310
    if (pStb->pExtSchemas) {
361,114✔
2311
      pSchExt->typeMod = pStb->pExtSchemas[i].typeMod;
24,970✔
2312
    }
2313
  }
2314
  pRsp->virtualStb = pStb->virtualStb;
46,882✔
2315
  pRsp->pColRefs = NULL;
46,882✔
2316

2317
  taosRUnLockLatch(&pStb->lock);
46,882✔
2318
  TAOS_RETURN(code);
46,882✔
2319
}
2320

2321
static int32_t mndValidateStbVersion(SMnode *pMnode, SSTableVersion *pStbVer, bool *schema, bool *sma) {
5,160,263✔
2322
  int32_t code = 0;
5,160,263✔
2323
  char    tbFName[TSDB_TABLE_FNAME_LEN] = {0};
5,160,263✔
2324
  snprintf(tbFName, sizeof(tbFName), "%s.%s", pStbVer->dbFName, pStbVer->stbName);
5,160,263✔
2325

2326
  SDbObj *pDb = mndAcquireDb(pMnode, pStbVer->dbFName);
5,160,263✔
2327
  if (pDb == NULL) {
5,160,263✔
2328
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
24,902✔
2329
    TAOS_RETURN(code);
24,902✔
2330
  }
2331

2332
  if (pDb->uid != pStbVer->dbId) {
5,135,361✔
2333
    mndReleaseDb(pMnode, pDb);
4,513✔
2334
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
4,513✔
2335
    TAOS_RETURN(code);
4,513✔
2336
  }
2337

2338
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
5,130,848✔
2339
  if (pStb == NULL) {
5,130,848✔
2340
    mndReleaseDb(pMnode, pDb);
1,330✔
2341
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
1,330✔
2342
    TAOS_RETURN(code);
1,330✔
2343
  }
2344

2345
  taosRLockLatch(&pStb->lock);
5,129,518✔
2346

2347
  if (pStbVer->sversion != pStb->colVer || pStbVer->tversion != pStb->tagVer) {
5,129,518✔
2348
    *schema = true;
19,562✔
2349
  } else {
2350
    *schema = false;
5,109,956✔
2351
  }
2352

2353
  if (pStbVer->smaVer && pStbVer->smaVer != pStb->smaVer) {
5,129,518✔
2354
    *sma = true;
×
2355
  } else {
2356
    *sma = false;
5,129,518✔
2357
  }
2358

2359
  taosRUnLockLatch(&pStb->lock);
5,129,518✔
2360

2361
  mndReleaseDb(pMnode, pDb);
5,129,518✔
2362
  mndReleaseStb(pMnode, pStb);
5,129,518✔
2363
  return TSDB_CODE_SUCCESS;
5,129,518✔
2364
}
2365

2366
static int32_t mndBuildStbSchema(SMnode *pMnode, const char *dbFName, const char *tbName, STableMetaRsp *pRsp, bool refByStm) {
15,693,056✔
2367
  int32_t code = 0;
15,693,056✔
2368
  char    tbFName[TSDB_TABLE_FNAME_LEN] = {0};
15,693,056✔
2369
  snprintf(tbFName, sizeof(tbFName), "%s.%s", dbFName, tbName);
15,693,056✔
2370

2371
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
15,693,056✔
2372
  if (pDb == NULL) {
15,693,056✔
2373
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
2374
    TAOS_RETURN(code);
×
2375
  }
2376

2377
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
15,693,056✔
2378
  if (pStb == NULL) {
15,693,056✔
2379
    mndReleaseDb(pMnode, pDb);
676,721✔
2380
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
676,721✔
2381
    TAOS_RETURN(code);
676,721✔
2382
  }
2383

2384
  code = mndBuildStbSchemaImp(pMnode, pDb, pStb, tbName, pRsp, refByStm);
15,016,335✔
2385
  mndReleaseDb(pMnode, pDb);
15,016,335✔
2386
  mndReleaseStb(pMnode, pStb);
15,016,335✔
2387
  TAOS_RETURN(code);
15,016,335✔
2388
}
2389

2390
static int32_t mndBuildStbCfg(SMnode *pMnode, const char *dbFName, const char *tbName, STableCfgRsp *pRsp) {
46,882✔
2391
  int32_t code = 0;
46,882✔
2392
  char    tbFName[TSDB_TABLE_FNAME_LEN] = {0};
46,882✔
2393
  snprintf(tbFName, sizeof(tbFName), "%s.%s", dbFName, tbName);
46,882✔
2394

2395
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
46,882✔
2396
  if (pDb == NULL) {
46,882✔
2397
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
2398
    TAOS_RETURN(code);
×
2399
  }
2400

2401
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
46,882✔
2402
  if (pStb == NULL) {
46,882✔
2403
    mndReleaseDb(pMnode, pDb);
×
2404
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
×
2405
    TAOS_RETURN(code);
×
2406
  }
2407

2408
  code = mndBuildStbCfgImp(pDb, pStb, tbName, pRsp);
46,882✔
2409

2410
  mndReleaseDb(pMnode, pDb);
46,882✔
2411
  mndReleaseStb(pMnode, pStb);
46,882✔
2412
  TAOS_RETURN(code);
46,882✔
2413
}
2414

2415
static int32_t mndBuildSMAlterStbRsp(SDbObj *pDb, SStbObj *pObj, void **pCont, int32_t *pLen) {
4,973,067✔
2416
  int32_t       code = 0;
4,973,067✔
2417
  SEncoder      ec = {0};
4,973,067✔
2418
  uint32_t      contLen = 0;
4,973,067✔
2419
  SMAlterStbRsp alterRsp = {0};
4,973,067✔
2420
  SName         name = {0};
4,973,067✔
2421
  TAOS_CHECK_RETURN(tNameFromString(&name, pObj->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
4,973,067✔
2422

2423
  alterRsp.pMeta = taosMemoryCalloc(1, sizeof(STableMetaRsp));
4,973,067✔
2424
  if (NULL == alterRsp.pMeta) {
4,973,067✔
2425
    code = terrno;
×
2426
    TAOS_RETURN(code);
×
2427
  }
2428

2429
  code = mndBuildStbSchemaImp(NULL, pDb, pObj, name.tname, alterRsp.pMeta, false);
4,973,067✔
2430
  if (code) {
4,973,067✔
2431
    tFreeSMAlterStbRsp(&alterRsp);
×
2432
    return code;
×
2433
  }
2434

2435
  tEncodeSize(tEncodeSMAlterStbRsp, &alterRsp, contLen, code);
4,973,067✔
2436
  if (code) {
4,973,067✔
2437
    tFreeSMAlterStbRsp(&alterRsp);
×
2438
    return code;
×
2439
  }
2440

2441
  void *cont = taosMemoryMalloc(contLen);
4,973,067✔
2442
  if (NULL == cont) {
4,973,067✔
2443
    code = terrno;
×
2444
    tFreeSMAlterStbRsp(&alterRsp);
×
2445
    TAOS_RETURN(code);
×
2446
  }
2447
  tEncoderInit(&ec, cont, contLen);
4,973,067✔
2448
  code = tEncodeSMAlterStbRsp(&ec, &alterRsp);
4,973,067✔
2449
  tEncoderClear(&ec);
4,973,067✔
2450

2451
  tFreeSMAlterStbRsp(&alterRsp);
4,973,067✔
2452

2453
  if (code < 0) TAOS_RETURN(code);
4,973,067✔
2454

2455
  *pCont = cont;
4,973,067✔
2456
  *pLen = contLen;
4,973,067✔
2457

2458
  TAOS_RETURN(code);
4,973,067✔
2459
}
2460

2461
int32_t mndBuildSMCreateStbRsp(SMnode *pMnode, char *dbFName, char *stbFName, void **pCont, int32_t *pLen) {
1,855,214✔
2462
  int32_t code = -1;
1,855,214✔
2463
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
1,855,214✔
2464
  if (NULL == pDb) {
1,855,214✔
2465
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2466
    if (terrno != 0) code = terrno;
×
2467
    TAOS_RETURN(code);
×
2468
  }
2469

2470
  SStbObj *pObj = mndAcquireStb(pMnode, stbFName);
1,855,214✔
2471
  if (NULL == pObj) {
1,855,214✔
2472
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
1,546✔
2473
    if (terrno != 0) code = terrno;
1,546✔
2474
    goto _OVER;
1,546✔
2475
  }
2476

2477
  SEncoder       ec = {0};
1,853,668✔
2478
  uint32_t       contLen = 0;
1,853,668✔
2479
  SMCreateStbRsp stbRsp = {0};
1,853,668✔
2480
  SName          name = {0};
1,853,668✔
2481
  TAOS_CHECK_GOTO(tNameFromString(&name, pObj->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE), NULL, _OVER);
1,853,668✔
2482

2483
  stbRsp.pMeta = taosMemoryCalloc(1, sizeof(STableMetaRsp));
1,853,668✔
2484
  if (NULL == stbRsp.pMeta) {
1,853,668✔
2485
    code = terrno;
×
2486
    goto _OVER;
×
2487
  }
2488

2489
  code = mndBuildStbSchemaImp(NULL, pDb, pObj, name.tname, stbRsp.pMeta, false);
1,853,668✔
2490
  if (code) {
1,853,668✔
2491
    tFreeSMCreateStbRsp(&stbRsp);
×
2492
    goto _OVER;
×
2493
  }
2494

2495
  tEncodeSize(tEncodeSMCreateStbRsp, &stbRsp, contLen, code);
1,853,668✔
2496
  if (code) {
1,853,668✔
2497
    tFreeSMCreateStbRsp(&stbRsp);
×
2498
    goto _OVER;
×
2499
  }
2500

2501
  void *cont = taosMemoryMalloc(contLen);
1,853,668✔
2502
  if (NULL == cont) {
1,853,668✔
2503
    code = terrno;
×
2504
    tFreeSMCreateStbRsp(&stbRsp);
×
2505
    goto _OVER;
×
2506
  }
2507
  tEncoderInit(&ec, cont, contLen);
1,853,668✔
2508
  TAOS_CHECK_GOTO(tEncodeSMCreateStbRsp(&ec, &stbRsp), NULL, _OVER);
1,853,668✔
2509
  tEncoderClear(&ec);
1,853,668✔
2510

2511
  tFreeSMCreateStbRsp(&stbRsp);
1,853,668✔
2512

2513
  *pCont = cont;
1,853,668✔
2514
  *pLen = contLen;
1,853,668✔
2515

2516
  code = 0;
1,853,668✔
2517

2518
_OVER:
1,855,214✔
2519
  if (pObj) {
1,855,214✔
2520
    mndReleaseStb(pMnode, pObj);
1,853,668✔
2521
  }
2522

2523
  if (pDb) {
1,855,214✔
2524
    mndReleaseDb(pMnode, pDb);
1,855,214✔
2525
  }
2526

2527
  TAOS_RETURN(code);
1,855,214✔
2528
}
2529

2530
static int32_t mndAlterStbImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
4,763,100✔
2531
                              void *alterOriData, int32_t alterOriDataLen) {
2532
  int32_t code = -1;
4,763,100✔
2533
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "alter-stb");
4,763,100✔
2534
  if (pTrans == NULL) {
4,763,100✔
2535
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2536
    if (terrno != 0) code = terrno;
×
2537
    goto _OVER;
×
2538
  }
2539

2540
  mInfo("trans:%d, used to alter stb:%s, alterOriDataLen:%d", pTrans->id, pStb->name, alterOriDataLen);
4,763,100✔
2541
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
4,763,100✔
2542
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
4,763,100✔
2543

2544
  if (needRsp) {
4,670,640✔
2545
    void   *pCont = NULL;
4,634,426✔
2546
    int32_t contLen = 0;
4,634,426✔
2547
    TAOS_CHECK_GOTO(mndBuildSMAlterStbRsp(pDb, pStb, &pCont, &contLen), NULL, _OVER);
4,634,426✔
2548
    mndTransSetRpcRsp(pTrans, pCont, contLen);
4,634,426✔
2549
  }
2550

2551
  TAOS_CHECK_GOTO(mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
4,670,640✔
2552
  TAOS_CHECK_GOTO(mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
4,670,640✔
2553
  TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
4,670,640✔
2554
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
4,670,640✔
2555

2556
  code = 0;
4,670,640✔
2557

2558
_OVER:
4,763,100✔
2559
  mndTransDrop(pTrans);
4,763,100✔
2560
  TAOS_RETURN(code);
4,763,100✔
2561
}
2562

2563
static int32_t mndAlterStbAndUpdateTagIdxImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
338,641✔
2564
                                             void *alterOriData, int32_t alterOriDataLen, const SMAlterStbReq *pAlter) {
2565
  int32_t code = -1;
338,641✔
2566
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "alter-stb");
338,641✔
2567
  if (pTrans == NULL) {
338,641✔
2568
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2569
    if (terrno != 0) code = terrno;
×
2570
    goto _OVER;
×
2571
  }
2572

2573
  mInfo("trans:%d, used to alter stb:%s", pTrans->id, pStb->name);
338,641✔
2574
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
338,641✔
2575

2576
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
338,641✔
2577

2578
  if (needRsp) {
338,641✔
2579
    void   *pCont = NULL;
338,641✔
2580
    int32_t contLen = 0;
338,641✔
2581
    TAOS_CHECK_GOTO(mndBuildSMAlterStbRsp(pDb, pStb, &pCont, &contLen), NULL, _OVER);
338,641✔
2582
    mndTransSetRpcRsp(pTrans, pCont, contLen);
338,641✔
2583
  }
2584

2585
  if (pAlter->alterType == TSDB_ALTER_TABLE_DROP_TAG) {
338,641✔
2586
    SIdxObj idxObj = {0};
141,852✔
2587
    SField *pField0 = taosArrayGet(pAlter->pFields, 0);
141,852✔
2588
    bool    exist = false;
141,852✔
2589
    if (mndGetIdxsByTagName(pMnode, pStb, pField0->name, &idxObj) == 0) {
141,852✔
2590
      exist = true;
3,508✔
2591
    }
2592
    TAOS_CHECK_GOTO(mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
141,852✔
2593
    TAOS_CHECK_GOTO(mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
141,852✔
2594

2595
    if (exist == true) {
141,852✔
2596
      TAOS_CHECK_GOTO(mndSetDropIdxPrepareLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
3,508✔
2597
      TAOS_CHECK_GOTO(mndSetDropIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
3,508✔
2598
    }
2599

2600
    TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
141,852✔
2601
    TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
141,852✔
2602

2603
  } else if (pAlter->alterType == TSDB_ALTER_TABLE_UPDATE_TAG_NAME) {
196,789✔
2604
    SIdxObj     idxObj = {0};
196,789✔
2605
    SField     *pField0 = taosArrayGet(pAlter->pFields, 0);
196,789✔
2606
    SField     *pField1 = taosArrayGet(pAlter->pFields, 1);
196,789✔
2607
    const char *oTagName = pField0->name;
196,789✔
2608
    const char *nTagName = pField1->name;
196,789✔
2609
    bool        exist = false;
196,789✔
2610

2611
    if (mndGetIdxsByTagName(pMnode, pStb, pField0->name, &idxObj) == 0) {
196,789✔
2612
      exist = true;
14,610✔
2613
    }
2614

2615
    TAOS_CHECK_GOTO(mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
196,789✔
2616
    TAOS_CHECK_GOTO(mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
196,789✔
2617

2618
    if (exist == true) {
196,789✔
2619
      memcpy(idxObj.colName, nTagName, strlen(nTagName));
14,610✔
2620
      idxObj.colName[strlen(nTagName)] = 0;
14,610✔
2621
      TAOS_CHECK_GOTO(mndSetAlterIdxPrepareLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
14,610✔
2622
      TAOS_CHECK_GOTO(mndSetAlterIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
14,610✔
2623
    }
2624

2625
    TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
196,789✔
2626
    TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
196,789✔
2627
  }
2628
  code = 0;
338,641✔
2629

2630
_OVER:
338,641✔
2631
  mndTransDrop(pTrans);
338,641✔
2632
  TAOS_RETURN(code);
338,641✔
2633
}
2634

2635
static int32_t mndAlterStb(SMnode *pMnode, SRpcMsg *pReq, const SMAlterStbReq *pAlter, SDbObj *pDb, SStbObj *pOld) {
5,987,850✔
2636
  bool    needRsp = true;
5,987,850✔
2637
  int32_t code = -1;
5,987,850✔
2638
  SField *pField0 = NULL;
5,987,850✔
2639

2640
  SStbObj stbObj = {0};
5,987,850✔
2641
  taosRLockLatch(&pOld->lock);
5,987,850✔
2642
  memcpy(&stbObj, pOld, sizeof(SStbObj));
5,987,850✔
2643
  taosRUnLockLatch(&pOld->lock);
5,987,850✔
2644
  stbObj.pColumns = NULL;
5,987,850✔
2645
  stbObj.pTags = NULL;
5,987,850✔
2646
  stbObj.pFuncs = NULL;
5,987,850✔
2647
  stbObj.pCmpr = NULL;
5,987,850✔
2648
  stbObj.pExtSchemas = NULL;
5,987,850✔
2649
  stbObj.updateTime = taosGetTimestampMs();
5,987,850✔
2650
  stbObj.lock = 0;
5,987,850✔
2651
  stbObj.virtualStb = pOld->virtualStb;
5,987,850✔
2652
  bool updateTagIndex = false;
5,987,850✔
2653
  switch (pAlter->alterType) {
5,987,850✔
2654
    case TSDB_ALTER_TABLE_ADD_TAG:
319,569✔
2655
      code = mndAddSuperTableTag(pOld, &stbObj, pAlter->pFields, pAlter->numOfFields);
319,569✔
2656
      break;
319,569✔
2657
    case TSDB_ALTER_TABLE_DROP_TAG:
141,852✔
2658
      pField0 = taosArrayGet(pAlter->pFields, 0);
141,852✔
2659
      code = mndDropSuperTableTag(pMnode, pOld, &stbObj, pField0->name);
141,852✔
2660
      updateTagIndex = true;
141,852✔
2661
      break;
141,852✔
2662
    case TSDB_ALTER_TABLE_UPDATE_TAG_NAME:
206,211✔
2663
      code = mndAlterStbTagName(pMnode, pOld, &stbObj, pAlter->pFields);
206,211✔
2664
      updateTagIndex = true;
206,211✔
2665
      break;
206,211✔
2666
    case TSDB_ALTER_TABLE_UPDATE_TAG_BYTES:
328,800✔
2667
      pField0 = taosArrayGet(pAlter->pFields, 0);
328,800✔
2668
      code = mndAlterStbTagBytes(pMnode, pOld, &stbObj, pField0);
328,800✔
2669
      break;
328,800✔
2670
    case TSDB_ALTER_TABLE_ADD_COLUMN:
2,565,852✔
2671
      code = mndAddSuperTableColumn(pOld, &stbObj, pAlter, pAlter->numOfFields, 0);
2,565,852✔
2672
      break;
2,565,852✔
2673
    case TSDB_ALTER_TABLE_DROP_COLUMN:
1,543,382✔
2674
      pField0 = taosArrayGet(pAlter->pFields, 0);
1,543,382✔
2675
      code = mndDropSuperTableColumn(pMnode, pOld, &stbObj, pField0->name);
1,543,382✔
2676
      break;
1,543,382✔
2677
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES:
501,360✔
2678
      pField0 = taosArrayGet(pAlter->pFields, 0);
501,360✔
2679
      code = mndAlterStbColumnBytes(pMnode, pOld, &stbObj, pField0);
501,360✔
2680
      break;
501,360✔
2681
    case TSDB_ALTER_TABLE_UPDATE_OPTIONS:
22,654✔
2682
      needRsp = false;
22,654✔
2683
      code = mndUpdateTableOptions(pOld, &stbObj, pAlter->comment, pAlter->commentLen, pAlter->ttl, pAlter->keep);
22,654✔
2684
      break;
22,654✔
2685
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_COMPRESS:
96,138✔
2686
      code = mndUpdateSuperTableColumnCompress(pMnode, pOld, &stbObj, pAlter->pFields, pAlter->numOfFields);
96,138✔
2687
      break;
96,138✔
2688
    case TSDB_ALTER_TABLE_ADD_COLUMN_WITH_COMPRESS_OPTION:
262,032✔
2689
      code = mndAddSuperTableColumn(pOld, &stbObj, pAlter, pAlter->numOfFields, 1);
262,032✔
2690
      break;
262,032✔
2691
    default:
×
2692
      needRsp = false;
×
2693
      terrno = TSDB_CODE_OPS_NOT_SUPPORT;
×
2694
      break;
×
2695
  }
2696

2697
  if (code != 0) goto _OVER;
5,987,850✔
2698
  if (updateTagIndex == false) {
5,088,181✔
2699
    code = mndAlterStbImp(pMnode, pReq, pDb, &stbObj, needRsp, pReq->pCont, pReq->contLen);
4,749,540✔
2700
  } else {
2701
    code = mndAlterStbAndUpdateTagIdxImp(pMnode, pReq, pDb, &stbObj, needRsp, pReq->pCont, pReq->contLen, pAlter);
338,641✔
2702
  }
2703

2704
_OVER:
5,987,850✔
2705
  taosMemoryFreeClear(stbObj.pTags);
5,987,850✔
2706
  taosMemoryFreeClear(stbObj.pColumns);
5,987,850✔
2707
  taosMemoryFreeClear(stbObj.pCmpr);
5,987,850✔
2708
  if (pAlter->commentLen > 0) {
5,987,850✔
2709
    taosMemoryFreeClear(stbObj.comment);
4,810✔
2710
  }
2711
  taosMemoryFreeClear(stbObj.pExtSchemas);
5,987,850✔
2712
  TAOS_RETURN(code);
5,987,850✔
2713
}
2714

2715
static int32_t mndProcessAlterStbReq(SRpcMsg *pReq) {
6,003,230✔
2716
  SMnode       *pMnode = pReq->info.node;
6,003,230✔
2717
  int32_t       code = -1;
6,003,230✔
2718
  SDbObj       *pDb = NULL;
6,003,230✔
2719
  SStbObj      *pStb = NULL;
6,003,230✔
2720
  SMAlterStbReq alterReq = {0};
6,003,230✔
2721

2722
  if (tDeserializeSMAlterStbReq(pReq->pCont, pReq->contLen, &alterReq) != 0) {
6,003,230✔
2723
    code = TSDB_CODE_INVALID_MSG;
×
2724
    goto _OVER;
×
2725
  }
2726

2727
  mInfo("stb:%s, start to alter", alterReq.name);
6,003,230✔
2728
  if (mndCheckAlterStbReq(&alterReq) != 0) goto _OVER;
6,003,230✔
2729

2730
  pDb = mndAcquireDbByStb(pMnode, alterReq.name);
6,003,230✔
2731
  if (pDb == NULL) {
6,003,230✔
2732
    code = TSDB_CODE_MND_DB_NOT_EXIST;
×
2733
    goto _OVER;
×
2734
  }
2735
  if (pDb->cfg.isMount) {
6,003,230✔
2736
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
640✔
2737
    goto _OVER;
640✔
2738
  }
2739

2740
  pStb = mndAcquireStb(pMnode, alterReq.name);
6,002,590✔
2741
  if (pStb == NULL) {
6,002,590✔
2742
    code = TSDB_CODE_MND_STB_NOT_EXIST;
14,740✔
2743
    goto _OVER;
14,740✔
2744
  }
2745

2746
  if ((code = mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_WRITE_DB, pDb)) != 0) {
5,987,850✔
2747
    goto _OVER;
×
2748
  }
2749

2750
  code = mndAlterStb(pMnode, pReq, &alterReq, pDb, pStb);
5,987,850✔
2751
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
5,987,850✔
2752

2753
  SName   name = {0};
5,987,850✔
2754
  int32_t ret = 0;
5,987,850✔
2755
  if ((ret = tNameFromString(&name, alterReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0)
5,987,850✔
2756
    mError("stb:%s, failed to tNameFromString since %s", alterReq.name, tstrerror(ret));
×
2757

2758
  auditRecord(pReq, pMnode->clusterId, "alterStb", name.dbname, name.tname, alterReq.sql, alterReq.sqlLen);
5,987,850✔
2759

2760
_OVER:
6,003,230✔
2761
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
6,003,230✔
2762
    mError("stb:%s, failed to alter since %s", alterReq.name, tstrerror(code));
1,007,509✔
2763
  }
2764

2765
  mndReleaseStb(pMnode, pStb);
6,003,230✔
2766
  mndReleaseDb(pMnode, pDb);
6,003,230✔
2767
  tFreeSMAltertbReq(&alterReq);
6,003,230✔
2768

2769
  TAOS_RETURN(code);
6,003,230✔
2770
}
2771

2772
static int32_t mndSetDropStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SStbObj *pStb) {
500,419✔
2773
  int32_t  code = 0;
500,419✔
2774
  SSdbRaw *pRedoRaw = mndStbActionEncode(pStb);
500,419✔
2775
  if (pRedoRaw == NULL) {
500,419✔
2776
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2777
    if (terrno != 0) code = terrno;
×
2778
    TAOS_RETURN(code);
×
2779
  }
2780
  if ((code = mndTransAppendPrepareLog(pTrans, pRedoRaw)) != 0) {
500,419✔
2781
    sdbFreeRaw(pRedoRaw);
×
2782
    TAOS_RETURN(code);
×
2783
  }
2784
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_DROPPING));
500,419✔
2785

2786
  TAOS_RETURN(code);
500,419✔
2787
}
2788

2789
static int32_t mndSetDropStbCommitLogs(SMnode *pMnode, STrans *pTrans, SStbObj *pStb) {
500,419✔
2790
  int32_t  code = 0;
500,419✔
2791
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
500,419✔
2792
  if (pCommitRaw == NULL) {
500,419✔
2793
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2794
    if (terrno != 0) code = terrno;
×
2795
    TAOS_RETURN(code);
×
2796
  }
2797
  if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
500,419✔
2798
    sdbFreeRaw(pCommitRaw);
×
2799
    TAOS_RETURN(code);
×
2800
  }
2801
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED));
500,419✔
2802

2803
  TAOS_RETURN(code);
500,419✔
2804
}
2805

2806
static int32_t mndSetDropStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
500,419✔
2807
  int32_t code = 0;
500,419✔
2808
  SSdb   *pSdb = pMnode->pSdb;
500,419✔
2809
  SVgObj *pVgroup = NULL;
500,419✔
2810
  void   *pIter = NULL;
500,419✔
2811

2812
  while (1) {
1,259,609✔
2813
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
1,760,028✔
2814
    if (pIter == NULL) break;
1,760,028✔
2815
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
1,259,609✔
2816
      sdbRelease(pSdb, pVgroup);
256,652✔
2817
      continue;
256,652✔
2818
    }
2819

2820
    int32_t contLen = 0;
1,002,957✔
2821
    void   *pReq = mndBuildVDropStbReq(pMnode, pVgroup, pStb, &contLen);
1,002,957✔
2822
    if (pReq == NULL) {
1,002,957✔
2823
      sdbCancelFetch(pSdb, pIter);
×
2824
      sdbRelease(pSdb, pVgroup);
×
2825
      code = TSDB_CODE_OUT_OF_MEMORY;
×
2826
      TAOS_RETURN(code);
×
2827
    }
2828

2829
    STransAction action = {0};
1,002,957✔
2830
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
1,002,957✔
2831
    action.pCont = pReq;
1,002,957✔
2832
    action.contLen = contLen;
1,002,957✔
2833
    action.msgType = TDMT_VND_DROP_STB;
1,002,957✔
2834
    action.acceptableCode = TSDB_CODE_TDB_STB_NOT_EXIST;
1,002,957✔
2835
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
1,002,957✔
2836
      taosMemoryFree(pReq);
×
2837
      sdbCancelFetch(pSdb, pIter);
×
2838
      sdbRelease(pSdb, pVgroup);
×
2839
      TAOS_RETURN(code);
×
2840
    }
2841
    sdbRelease(pSdb, pVgroup);
1,002,957✔
2842
  }
2843

2844
  TAOS_RETURN(code);
500,419✔
2845
}
2846

2847
static int32_t mndDropStb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb) {
500,419✔
2848
  int32_t code = -1;
500,419✔
2849
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "drop-stb");
500,419✔
2850
  if (pTrans == NULL) {
500,419✔
2851
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2852
    if (terrno != 0) code = terrno;
×
2853
    goto _OVER;
×
2854
  }
2855

2856
  mInfo("trans:%d, used to drop stb:%s", pTrans->id, pStb->name);
500,419✔
2857
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
500,419✔
2858
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
500,419✔
2859

2860
  TAOS_CHECK_GOTO(mndSetDropStbPrepareLogs(pMnode, pTrans, pStb), NULL, _OVER);
500,419✔
2861
  TAOS_CHECK_GOTO(mndSetDropStbCommitLogs(pMnode, pTrans, pStb), NULL, _OVER);
500,419✔
2862
  TAOS_CHECK_GOTO(mndSetDropStbRedoActions(pMnode, pTrans, pDb, pStb), NULL, _OVER);
500,419✔
2863
  TAOS_CHECK_GOTO(mndDropIdxsByStb(pMnode, pTrans, pDb, pStb), NULL, _OVER);
500,419✔
2864
  TAOS_CHECK_GOTO(mndDropRsmaByStb(pMnode, pTrans, pDb, pStb), NULL, _OVER);
500,419✔
2865
  TAOS_CHECK_GOTO(mndUserRemoveStb(pMnode, pTrans, pStb->name), NULL, _OVER);
500,419✔
2866
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
500,419✔
2867
  code = 0;
500,419✔
2868

2869
_OVER:
500,419✔
2870
  mndTransDrop(pTrans);
500,419✔
2871
  TAOS_RETURN(code);
500,419✔
2872
}
2873

2874
static int32_t mndCheckDropStbForTopic(SMnode *pMnode, const char *stbFullName, int64_t suid) {
501,059✔
2875
  int32_t code = 0;
501,059✔
2876
  SSdb   *pSdb = pMnode->pSdb;
501,059✔
2877
  void   *pIter = NULL;
501,059✔
2878
  while (1) {
1,550✔
2879
    SMqTopicObj *pTopic = NULL;
502,609✔
2880
    pIter = sdbFetch(pSdb, SDB_TOPIC, pIter, (void **)&pTopic);
502,609✔
2881
    if (pIter == NULL) break;
502,609✔
2882

2883
    if (pTopic->stbUid == suid) {
1,550✔
2884
      sdbRelease(pSdb, pTopic);
×
2885
      sdbCancelFetch(pSdb, pIter);
×
2886
      TAOS_RETURN(TSDB_CODE_MND_TOPIC_MUST_BE_DELETED);
×
2887
    }
2888
    sdbRelease(pSdb, pTopic);
1,550✔
2889
  }
2890
  TAOS_RETURN(code);
501,059✔
2891
}
2892

2893
static int32_t mndCheckDropStbForStream(SMnode *pMnode, const char *stbFullName, int64_t suid) {
×
2894
  int32_t code = 0;
×
2895
  SSdb   *pSdb = pMnode->pSdb;
×
2896
  void   *pIter = NULL;
×
2897
  while (1) {
×
2898
    SStreamObj *pStream = NULL;
×
2899
    pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
×
2900
    if (pIter == NULL) break;
×
2901

2902
    if (pStream->pCreate->outStbUid == suid) {
×
2903
      sdbCancelFetch(pSdb, pIter);
×
2904
      sdbRelease(pSdb, pStream);
×
2905
      TAOS_RETURN(-1);
×
2906
    }
2907

2908
    sdbRelease(pSdb, pStream);
×
2909
  }
2910
  TAOS_RETURN(code);
×
2911
}
2912

2913
static int32_t mndProcessDropTtltbRsp(SRpcMsg *pRsp) { return 0; }
×
2914
static int32_t mndProcessTrimDbRsp(SRpcMsg *pRsp) { return 0; }
×
2915
static int32_t mndProcessTrimDbWalRsp(SRpcMsg *pRsp) { return 0; }
1,192✔
2916
static int32_t mndProcessS3MigrateDbRsp(SRpcMsg *pRsp) { return 0; }
×
2917

2918
static int32_t mndProcessDropStbReq(SRpcMsg *pReq) {
823,191✔
2919
  SMnode      *pMnode = pReq->info.node;
823,191✔
2920
  int32_t      code = -1;
823,191✔
2921
  SDbObj      *pDb = NULL;
823,191✔
2922
  SStbObj     *pStb = NULL;
823,191✔
2923
  SMDropStbReq dropReq = {0};
823,191✔
2924

2925
  TAOS_CHECK_GOTO(tDeserializeSMDropStbReq(pReq->pCont, pReq->contLen, &dropReq), NULL, _OVER);
823,191✔
2926

2927
  mInfo("stb:%s, start to drop", dropReq.name);
823,191✔
2928

2929
  pStb = mndAcquireStb(pMnode, dropReq.name);
823,191✔
2930
  if (pStb == NULL) {
823,191✔
2931
    if (dropReq.igNotExists) {
322,132✔
2932
      mInfo("stb:%s, not exist, ignore not exist is set", dropReq.name);
321,134✔
2933
      code = 0;
321,134✔
2934
      goto _OVER;
321,134✔
2935
    } else {
2936
      code = TSDB_CODE_MND_STB_NOT_EXIST;
998✔
2937
      goto _OVER;
998✔
2938
    }
2939
  }
2940

2941
  if ((dropReq.source == TD_REQ_FROM_TAOX_OLD || dropReq.source == TD_REQ_FROM_TAOX) && pStb->uid != dropReq.suid) {
501,059✔
2942
    code = 0;
×
2943
    goto _OVER;
×
2944
  }
2945

2946
  pDb = mndAcquireDbByStb(pMnode, dropReq.name);
501,059✔
2947
  if (pDb == NULL) {
501,059✔
2948
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
2949
    goto _OVER;
×
2950
  }
2951

2952
  if ((code = mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_WRITE_DB, pDb)) != 0) {
501,059✔
2953
    goto _OVER;
×
2954
  }
2955

2956
  if ((code = mndCheckDropStbForTopic(pMnode, dropReq.name, pStb->uid)) != 0) {
501,059✔
2957
    goto _OVER;
×
2958
  }
2959

2960
  if (pDb->cfg.isMount) {
501,059✔
2961
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
640✔
2962
    goto _OVER;
640✔
2963
  }
2964

2965
  code = mndDropStb(pMnode, pReq, pDb, pStb);
500,419✔
2966
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
500,419✔
2967

2968
  SName   name = {0};
500,419✔
2969
  int32_t ret = 0;
500,419✔
2970
  if ((ret = tNameFromString(&name, dropReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0)
500,419✔
2971
    mError("stb:%s, failed to tNameFromString since %s", dropReq.name, tstrerror(ret));
×
2972

2973
  auditRecord(pReq, pMnode->clusterId, "dropStb", name.dbname, name.tname, dropReq.sql, dropReq.sqlLen);
500,419✔
2974

2975
_OVER:
823,191✔
2976
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
823,191✔
2977
    mError("stb:%s, failed to drop since %s", dropReq.name, tstrerror(code));
1,638✔
2978
  }
2979

2980
  mndReleaseDb(pMnode, pDb);
823,191✔
2981
  mndReleaseStb(pMnode, pStb);
823,191✔
2982
  tFreeSMDropStbReq(&dropReq);
823,191✔
2983
  TAOS_RETURN(code);
823,191✔
2984
}
2985

2986
static int32_t mndProcessTableMetaReq(SRpcMsg *pReq) {
18,025,786✔
2987
  SMnode       *pMnode = pReq->info.node;
18,025,786✔
2988
  int32_t       code = -1;
18,025,786✔
2989
  STableInfoReq infoReq = {0};
18,025,786✔
2990
  STableMetaRsp metaRsp = {0};
18,025,522✔
2991
  SUserObj     *pUser = NULL;
18,025,522✔
2992

2993
  code = mndAcquireUser(pMnode, pReq->info.conn.user, &pUser);
18,025,786✔
2994
  if (pUser == NULL) return 0;
18,025,786✔
2995
  bool sysinfo = pUser->sysInfo;
18,025,786✔
2996

2997
  TAOS_CHECK_GOTO(tDeserializeSTableInfoReq(pReq->pCont, pReq->contLen, &infoReq), NULL, _OVER);
18,025,786✔
2998

2999
  if (0 == strcmp(infoReq.dbFName, TSDB_INFORMATION_SCHEMA_DB)) {
18,025,786✔
3000
    mInfo("information_schema table:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
2,205,525✔
3001
    TAOS_CHECK_GOTO(mndBuildInsTableSchema(pMnode, infoReq.dbFName, infoReq.tbName, sysinfo, &metaRsp), NULL, _OVER);
2,205,525✔
3002
  } else if (0 == strcmp(infoReq.dbFName, TSDB_PERFORMANCE_SCHEMA_DB)) {
15,820,261✔
3003
    mInfo("performance_schema table:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
146,767✔
3004
    TAOS_CHECK_GOTO(mndBuildPerfsTableSchema(pMnode, infoReq.dbFName, infoReq.tbName, &metaRsp), NULL, _OVER);
146,767✔
3005
  } else {
3006
    mInfo("stb:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
15,673,494✔
3007
    TAOS_CHECK_GOTO(mndBuildStbSchema(pMnode, infoReq.dbFName, infoReq.tbName, &metaRsp, true), NULL, _OVER);
15,673,494✔
3008
  }
3009

3010
  int32_t rspLen = tSerializeSTableMetaRsp(NULL, 0, &metaRsp);
17,130,756✔
3011
  if (rspLen < 0) {
17,130,756✔
3012
    code = TSDB_CODE_INVALID_MSG;
×
3013
    goto _OVER;
×
3014
  }
3015

3016
  void *pRsp = rpcMallocCont(rspLen);
17,130,756✔
3017
  if (pRsp == NULL) {
17,130,756✔
3018
    code = terrno;
×
3019
    goto _OVER;
×
3020
  }
3021

3022
  if ((rspLen = tSerializeSTableMetaRsp(pRsp, rspLen, &metaRsp)) < 0) {
17,130,756✔
3023
    code = rspLen;
×
3024
    goto _OVER;
×
3025
  }
3026
  pReq->info.rsp = pRsp;
17,130,756✔
3027
  pReq->info.rspLen = rspLen;
17,130,756✔
3028
  code = 0;
17,130,756✔
3029

3030
  mTrace("%s.%s, meta is retrieved", infoReq.dbFName, infoReq.tbName);
17,130,756✔
3031

3032
_OVER:
18,025,786✔
3033
  if (code != 0) {
18,025,786✔
3034
    mError("stb:%s.%s, failed to retrieve meta since %s", infoReq.dbFName, infoReq.tbName, tstrerror(code));
895,030✔
3035
  }
3036

3037
  mndReleaseUser(pMnode, pUser);
18,025,786✔
3038
  tFreeSTableMetaRsp(&metaRsp);
18,025,786✔
3039
  // TODO change to TAOS_RETURN
3040
  return code;
18,025,786✔
3041
}
3042

3043
static int32_t mndProcessTableCfgReq(SRpcMsg *pReq) {
57,712✔
3044
  SMnode      *pMnode = pReq->info.node;
57,712✔
3045
  int32_t      code = -1;
57,712✔
3046
  STableCfgReq cfgReq = {0};
57,712✔
3047
  STableCfgRsp cfgRsp = {0};
57,712✔
3048

3049
  TAOS_CHECK_GOTO(tDeserializeSTableCfgReq(pReq->pCont, pReq->contLen, &cfgReq), NULL, _OVER);
57,712✔
3050

3051
  char dbName[TSDB_DB_NAME_LEN] = {0};
57,712✔
3052
  TAOS_CHECK_GOTO(mndExtractShortDbNameFromDbFullName(cfgReq.dbFName, dbName), NULL, _OVER);
57,712✔
3053
  if (0 == strcmp(dbName, TSDB_INFORMATION_SCHEMA_DB)) {
57,712✔
3054
    mInfo("information_schema table:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
7,220✔
3055
    TAOS_CHECK_GOTO(mndBuildInsTableCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
7,220✔
3056
  } else if (0 == strcmp(dbName, TSDB_PERFORMANCE_SCHEMA_DB)) {
50,492✔
3057
    mInfo("performance_schema table:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
3,610✔
3058
    TAOS_CHECK_GOTO(mndBuildPerfsTableCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
3,610✔
3059
  } else {
3060
    mInfo("stb:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
46,882✔
3061
    TAOS_CHECK_GOTO(mndBuildStbCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
46,882✔
3062
  }
3063

3064
  int32_t rspLen = tSerializeSTableCfgRsp(NULL, 0, &cfgRsp);
57,712✔
3065
  if (rspLen < 0) {
57,712✔
3066
    code = TSDB_CODE_INVALID_MSG;
×
3067
    goto _OVER;
×
3068
  }
3069

3070
  void *pRsp = rpcMallocCont(rspLen);
57,712✔
3071
  if (pRsp == NULL) {
57,712✔
3072
    code = terrno;
×
3073
    goto _OVER;
×
3074
  }
3075

3076
  if ((rspLen = tSerializeSTableCfgRsp(pRsp, rspLen, &cfgRsp)) < 0) {
57,712✔
3077
    code = rspLen;
×
3078
    goto _OVER;
×
3079
  }
3080
  pReq->info.rsp = pRsp;
57,712✔
3081
  pReq->info.rspLen = rspLen;
57,712✔
3082
  code = 0;
57,712✔
3083

3084
  mTrace("%s.%s, cfg is retrieved", cfgReq.dbFName, cfgReq.tbName);
57,712✔
3085

3086
_OVER:
57,712✔
3087
  if (code != 0) {
57,712✔
3088
    mError("stb:%s.%s, failed to retrieve cfg since %s", cfgReq.dbFName, cfgReq.tbName, tstrerror(code));
×
3089
  }
3090

3091
  tFreeSTableCfgRsp(&cfgRsp);
57,712✔
3092
  TAOS_RETURN(code);
57,712✔
3093
}
3094

3095
int32_t mndValidateStbInfo(SMnode *pMnode, SSTableVersion *pStbVersions, int32_t numOfStbs, void **ppRsp,
2,822,587✔
3096
                           int32_t *pRspLen) {
3097
  int32_t   code = 0;
2,822,587✔
3098
  SSTbHbRsp hbRsp = {0};
2,822,587✔
3099
  hbRsp.pMetaRsp = taosArrayInit(numOfStbs, sizeof(STableMetaRsp));
2,822,587✔
3100
  if (hbRsp.pMetaRsp == NULL) {
2,822,587✔
3101
    code = terrno;
×
3102
    TAOS_RETURN(code);
×
3103
  }
3104

3105
  hbRsp.pIndexRsp = taosArrayInit(numOfStbs, sizeof(STableIndexRsp));
2,822,587✔
3106
  if (NULL == hbRsp.pIndexRsp) {
2,822,587✔
3107
    taosArrayDestroy(hbRsp.pMetaRsp);
×
3108
    code = terrno;
×
3109
    TAOS_RETURN(code);
×
3110
  }
3111

3112
  for (int32_t i = 0; i < numOfStbs; ++i) {
7,982,850✔
3113
    SSTableVersion *pStbVersion = &pStbVersions[i];
5,160,263✔
3114
    pStbVersion->suid = be64toh(pStbVersion->suid);
5,160,263✔
3115
    pStbVersion->sversion = ntohl(pStbVersion->sversion);
5,160,263✔
3116
    pStbVersion->tversion = ntohl(pStbVersion->tversion);
5,160,263✔
3117
    pStbVersion->smaVer = ntohl(pStbVersion->smaVer);
5,160,263✔
3118

3119
    bool    schema = false;
5,160,263✔
3120
    bool    sma = false;
5,160,263✔
3121
    int32_t code = mndValidateStbVersion(pMnode, pStbVersion, &schema, &sma);
5,160,263✔
3122
    if (TSDB_CODE_SUCCESS != code) {
5,160,263✔
3123
      STableMetaRsp metaRsp = {0};
30,745✔
3124
      metaRsp.numOfColumns = -1;
30,745✔
3125
      metaRsp.suid = pStbVersion->suid;
30,745✔
3126
      tstrncpy(metaRsp.dbFName, pStbVersion->dbFName, sizeof(metaRsp.dbFName));
30,745✔
3127
      tstrncpy(metaRsp.tbName, pStbVersion->stbName, sizeof(metaRsp.tbName));
30,745✔
3128
      tstrncpy(metaRsp.stbName, pStbVersion->stbName, sizeof(metaRsp.stbName));
30,745✔
3129
      if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
61,490✔
3130
        code = terrno;
×
3131
        return code;
×
3132
      }
3133
      continue;
30,745✔
3134
    }
3135

3136
    if (schema) {
5,129,518✔
3137
      STableMetaRsp metaRsp = {0};
19,562✔
3138
      mInfo("stb:%s.%s, start to retrieve meta", pStbVersion->dbFName, pStbVersion->stbName);
19,562✔
3139
      if (mndBuildStbSchema(pMnode, pStbVersion->dbFName, pStbVersion->stbName, &metaRsp, false) != 0) {
19,562✔
3140
        metaRsp.numOfColumns = -1;
×
3141
        metaRsp.suid = pStbVersion->suid;
×
3142
        tstrncpy(metaRsp.dbFName, pStbVersion->dbFName, sizeof(metaRsp.dbFName));
×
3143
        tstrncpy(metaRsp.tbName, pStbVersion->stbName, sizeof(metaRsp.tbName));
×
3144
        tstrncpy(metaRsp.stbName, pStbVersion->stbName, sizeof(metaRsp.stbName));
×
3145
        if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
×
3146
          code = terrno;
×
3147
          return code;
×
3148
        }
3149
        continue;
×
3150
      }
3151

3152
      if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
39,124✔
3153
        code = terrno;
×
3154
        return code;
×
3155
      }
3156
    }
3157

3158
    if (sma) {
5,129,518✔
3159
      bool           exist = false;
×
3160
      char           tbFName[TSDB_TABLE_FNAME_LEN];
×
3161
      STableIndexRsp indexRsp = {0};
×
3162
      indexRsp.pIndex = taosArrayInit(10, sizeof(STableIndexInfo));
×
3163
      if (NULL == indexRsp.pIndex) {
×
3164
        code = terrno;
×
3165
        TAOS_RETURN(code);
×
3166
      }
3167

3168
      (void)tsnprintf(tbFName, sizeof(tbFName), "%s.%s", pStbVersion->dbFName, pStbVersion->stbName);
×
3169
      tstrncpy(indexRsp.dbFName, pStbVersion->dbFName, sizeof(indexRsp.dbFName));
×
3170
      tstrncpy(indexRsp.tbName, pStbVersion->stbName, sizeof(indexRsp.tbName));
×
3171

3172
      if (taosArrayPush(hbRsp.pIndexRsp, &indexRsp) == NULL) {
×
3173
        code = terrno;
×
3174
        return code;
×
3175
      }
3176
    }
3177
  }
3178

3179
  int32_t rspLen = tSerializeSSTbHbRsp(NULL, 0, &hbRsp);
2,822,587✔
3180
  if (rspLen < 0) {
2,822,587✔
3181
    tFreeSSTbHbRsp(&hbRsp);
×
3182
    code = TSDB_CODE_INVALID_MSG;
×
3183
    TAOS_RETURN(code);
×
3184
  }
3185

3186
  void *pRsp = taosMemoryMalloc(rspLen);
2,822,587✔
3187
  if (pRsp == NULL) {
2,822,587✔
3188
    tFreeSSTbHbRsp(&hbRsp);
×
3189
    code = terrno;
×
3190
    TAOS_RETURN(code);
×
3191
  }
3192

3193
  rspLen = tSerializeSSTbHbRsp(pRsp, rspLen, &hbRsp);
2,822,587✔
3194
  tFreeSSTbHbRsp(&hbRsp);
2,822,587✔
3195
  if (rspLen < 0) return rspLen;
2,822,587✔
3196
  *ppRsp = pRsp;
2,822,587✔
3197
  *pRspLen = rspLen;
2,822,587✔
3198
  TAOS_RETURN(code);
2,822,587✔
3199
}
3200

3201
int32_t mndGetNumOfStbs(SMnode *pMnode, char *dbName, int32_t *pNumOfStbs) {
1,951,929✔
3202
  int32_t code = 0;
1,951,929✔
3203
  SSdb   *pSdb = pMnode->pSdb;
1,951,929✔
3204
  SDbObj *pDb = mndAcquireDb(pMnode, dbName);
1,951,929✔
3205
  if (pDb == NULL) {
1,951,929✔
3206
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
3207
    TAOS_RETURN(code);
×
3208
  }
3209

3210
  int32_t numOfStbs = 0;
1,951,929✔
3211
  void   *pIter = NULL;
1,951,929✔
3212
  while (1) {
32,166,642✔
3213
    SStbObj *pStb = NULL;
34,118,571✔
3214
    pIter = sdbFetch(pSdb, SDB_STB, pIter, (void **)&pStb);
34,118,571✔
3215
    if (pIter == NULL) break;
34,118,571✔
3216

3217
    if (pStb->dbUid == pDb->uid) {
32,166,642✔
3218
      numOfStbs++;
28,908,818✔
3219
    }
3220

3221
    sdbRelease(pSdb, pStb);
32,166,642✔
3222
  }
3223

3224
  *pNumOfStbs = numOfStbs;
1,951,929✔
3225
  mndReleaseDb(pMnode, pDb);
1,951,929✔
3226
  TAOS_RETURN(code);
1,951,929✔
3227
}
3228

3229
int32_t mndExtractDbNameFromStbFullName(const char *stbFullName, char *dst) {
×
3230
  SName name = {0};
×
3231
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
×
3232

3233
  TAOS_CHECK_RETURN(tNameGetFullDbName(&name, dst));
×
3234

3235
  return 0;
×
3236
}
3237

3238
int32_t mndExtractShortDbNameFromStbFullName(const char *stbFullName, char *dst) {
81,979✔
3239
  SName name = {0};
81,979✔
3240
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
81,979✔
3241

3242
  TAOS_CHECK_RETURN(tNameGetDbName(&name, dst));
81,979✔
3243

3244
  return 0;
81,979✔
3245
}
3246

3247
int32_t mndExtractShortDbNameFromDbFullName(const char *stbFullName, char *dst) {
57,712✔
3248
  SName name = {0};
57,712✔
3249
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB));
57,712✔
3250

3251
  TAOS_CHECK_RETURN(tNameGetDbName(&name, dst));
57,712✔
3252

3253
  return 0;
57,712✔
3254
}
3255

3256
void mndExtractTbNameFromStbFullName(const char *stbFullName, char *dst, int32_t dstSize) {
1,739,500✔
3257
  int32_t pos = -1;
1,739,500✔
3258
  int32_t num = 0;
1,739,500✔
3259
  for (pos = 0; stbFullName[pos] != 0; ++pos) {
16,186,079✔
3260
    if (stbFullName[pos] == TS_PATH_DELIMITER[0]) num++;
16,186,079✔
3261
    if (num == 2) break;
16,186,079✔
3262
  }
3263

3264
  if (num == 2) {
1,739,500✔
3265
    tstrncpy(dst, stbFullName + pos + 1, dstSize);
1,739,500✔
3266
  }
3267
}
1,739,500✔
3268

3269
static int32_t mndRetrieveStb(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
347,104✔
3270
  SMnode   *pMnode = pReq->info.node;
347,104✔
3271
  SSdb     *pSdb = pMnode->pSdb;
347,104✔
3272
  int32_t   numOfRows = 0;
347,104✔
3273
  SStbObj  *pStb = NULL;
347,104✔
3274
  SUserObj *pUser = NULL;
347,104✔
3275
  int32_t   cols = 0;
347,104✔
3276
  int32_t   lino = 0;
347,104✔
3277
  int32_t   code = 0;
347,104✔
3278

3279
  SDbObj *pDb = NULL;
347,104✔
3280
  if (strlen(pShow->db) > 0) {
347,104✔
3281
    pDb = mndAcquireDb(pMnode, pShow->db);
265,403✔
3282
    if (pDb == NULL) return terrno;
265,403✔
3283
  }
3284

3285
  if ((code = mndAcquireUser(pMnode, pReq->info.conn.user, &pUser)) != 0) {
344,421✔
3286
    goto _ERROR;
×
3287
  }
3288

3289
  while (numOfRows < rows) {
2,797,454✔
3290
    pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb);
2,795,329✔
3291
    if (pShow->pIter == NULL) break;
2,795,329✔
3292

3293
    if (pDb != NULL && pStb->dbUid != pDb->uid) {
2,453,033✔
3294
      sdbRelease(pSdb, pStb);
1,073,679✔
3295
      continue;
1,073,679✔
3296
    }
3297

3298
    if (isTsmaResSTb(pStb->name)) {
1,379,354✔
3299
      sdbRelease(pSdb, pStb);
×
3300
      continue;
×
3301
    }
3302

3303
    if ((0 == pUser->superUser) && mndCheckStbPrivilege(pMnode, pUser, MND_OPER_SHOW_STB, pStb) != 0) {
1,379,354✔
3304
      sdbRelease(pSdb, pStb);
3,913✔
3305
      terrno = 0;
3,913✔
3306
      continue;
3,913✔
3307
    }
3308

3309
    cols = 0;
1,375,441✔
3310

3311
    SName name = {0};
1,375,441✔
3312

3313
    char stbName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,375,441✔
3314
    mndExtractTbNameFromStbFullName(pStb->name, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN);
1,375,441✔
3315
    varDataSetLen(stbName, strlen(&stbName[VARSTR_HEADER_SIZE]));
1,375,441✔
3316
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,375,441✔
3317
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stbName, false), pStb, &lino, _ERROR);
1,375,441✔
3318

3319
    char db[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,375,441✔
3320
    RETRIEVE_CHECK_GOTO(tNameFromString(&name, pStb->db, T_NAME_ACCT | T_NAME_DB), pStb, &lino, _ERROR);
1,375,441✔
3321
    RETRIEVE_CHECK_GOTO(tNameGetDbName(&name, varDataVal(db)), pStb, &lino, _ERROR);
1,375,441✔
3322
    varDataSetLen(db, strlen(varDataVal(db)));
1,375,441✔
3323
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,375,441✔
3324
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)db, false), pStb, &lino, _ERROR);
1,375,441✔
3325

3326
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,375,441✔
3327
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->createdTime, false), pStb, &lino,
1,375,441✔
3328
                        _ERROR);
3329

3330
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,375,441✔
3331
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->numOfColumns, false), pStb, &lino,
1,375,441✔
3332
                        _ERROR);
3333

3334
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,375,441✔
3335
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->numOfTags, false), pStb, &lino, _ERROR);
1,375,441✔
3336

3337
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,375,441✔
3338
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->updateTime, false), pStb, &lino,
1,375,441✔
3339
                        _ERROR);  // number of tables
3340

3341
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,375,441✔
3342
    if (pStb->commentLen > 0) {
1,375,441✔
3343
      char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
14,059✔
3344
      STR_TO_VARSTR(comment, pStb->comment);
14,059✔
3345
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, comment, false), pStb, &lino, _ERROR);
14,059✔
3346
    } else if (pStb->commentLen == 0) {
1,361,382✔
3347
      char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
197,496✔
3348
      STR_TO_VARSTR(comment, "");
197,496✔
3349
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, comment, false), pStb, &lino, _ERROR);
197,496✔
3350
    } else {
3351
      colDataSetNULL(pColInfo, numOfRows);
1,163,886✔
3352
    }
3353

3354
    char watermark[64 + VARSTR_HEADER_SIZE] = {0};
1,375,441✔
3355
    (void)tsnprintf(varDataVal(watermark), sizeof(watermark) - VARSTR_HEADER_SIZE, "%" PRId64 "a,%" PRId64 "a",
2,750,882✔
3356
              pStb->watermark[0], pStb->watermark[1]);
2,750,882✔
3357
    varDataSetLen(watermark, strlen(varDataVal(watermark)));
1,375,441✔
3358

3359
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,375,441✔
3360
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)watermark, false), pStb, &lino, _ERROR);
1,375,441✔
3361

3362
    char maxDelay[64 + VARSTR_HEADER_SIZE] = {0};
1,375,441✔
3363
    (void)tsnprintf(varDataVal(maxDelay), sizeof(maxDelay) - VARSTR_HEADER_SIZE, "%" PRId64 "a,%" PRId64 "a",
2,750,882✔
3364
              pStb->maxdelay[0], pStb->maxdelay[1]);
2,750,882✔
3365
    varDataSetLen(maxDelay, strlen(varDataVal(maxDelay)));
1,375,441✔
3366

3367
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,375,441✔
3368
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)maxDelay, false), pStb, &lino, _ERROR);
1,375,441✔
3369

3370
    char    rollup[160 + VARSTR_HEADER_SIZE] = {0};
1,375,441✔
3371
    int32_t rollupNum = (int32_t)taosArrayGetSize(pStb->pFuncs);
1,375,441✔
3372
    char   *sep = ", ";
1,375,441✔
3373
    int32_t sepLen = strlen(sep);
1,375,441✔
3374
    int32_t rollupLen = sizeof(rollup) - VARSTR_HEADER_SIZE - 2;
1,375,441✔
3375
    for (int32_t i = 0; i < rollupNum; ++i) {
1,375,441✔
3376
      char *funcName = taosArrayGet(pStb->pFuncs, i);
×
3377
      if (i) {
×
3378
        (void)strncat(varDataVal(rollup), sep, rollupLen);
×
3379
        rollupLen -= sepLen;
×
3380
      }
3381
      (void)strncat(varDataVal(rollup), funcName, rollupLen);
×
3382
      rollupLen -= strlen(funcName);
×
3383
    }
3384
    varDataSetLen(rollup, strlen(varDataVal(rollup)));
1,375,441✔
3385

3386
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,375,441✔
3387
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)rollup, false), pStb, &lino, _ERROR);
1,375,441✔
3388

3389
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,375,441✔
3390
    if (pColInfo) {
1,375,441✔
3391
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->uid), false), pStb, &lino, _ERROR);
1,375,441✔
3392
    }
3393

3394
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,375,441✔
3395
    if (pColInfo) {
1,375,441✔
3396
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->virtualStb), false), pStb, &lino, _ERROR);
1,375,441✔
3397
    }
3398

3399
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,375,441✔
3400
    if (pColInfo) {
1,375,441✔
3401
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->keep), false), pStb, &lino, _ERROR);
1,375,441✔
3402
    }
3403

3404
    numOfRows++;
1,375,441✔
3405
    sdbRelease(pSdb, pStb);
1,375,441✔
3406
  }
3407

3408
  if (pDb != NULL) {
344,421✔
3409
    mndReleaseDb(pMnode, pDb);
262,720✔
3410
  }
3411
  if (pUser != NULL) {
344,421✔
3412
    mndReleaseUser(pMnode, pUser);
344,421✔
3413
  }
3414

3415
  goto _OVER;
344,421✔
3416

3417
_ERROR:
×
3418
  if (pDb != NULL) {
×
3419
    mndReleaseDb(pMnode, pDb);
×
3420
  }
3421
  if (pUser != NULL) {
×
3422
    mndReleaseUser(pMnode, pUser);
×
3423
  }
3424
  mError("show:0x%" PRIx64 ", failed to retrieve data at %s:%d since %s", pShow->id, __FUNCTION__, lino,
×
3425
         tstrerror(code));
3426

3427
_OVER:
344,421✔
3428
  pShow->numOfRows += numOfRows;
344,421✔
3429
  return numOfRows;
344,421✔
3430
}
3431

3432
static int32_t buildDbColsInfoBlock(const SSDataBlock *p, const SSysTableMeta *pSysDbTableMeta, size_t size,
985,368✔
3433
                                    const char *dbName, const char *tbName) {
3434
  char    tName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
985,368✔
3435
  char    dName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
985,368✔
3436
  char    typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
985,368✔
3437
  int32_t numOfRows = p->info.rows;
985,368✔
3438
  int32_t lino = 0;
985,368✔
3439
  int32_t code = 0;
985,368✔
3440

3441
  STR_TO_VARSTR(dName, dbName);
985,368✔
3442
  STR_TO_VARSTR(typeName, "SYSTEM_TABLE");
985,368✔
3443

3444
  for (int32_t i = 0; i < size; ++i) {
28,082,790✔
3445
    const SSysTableMeta *pm = &pSysDbTableMeta[i];
27,096,828✔
3446
    //    if (pm->sysInfo) {
3447
    //      continue;
3448
    //    }
3449
    if (tbName[0] && strncmp(tbName, pm->name, TSDB_TABLE_NAME_LEN) != 0) {
27,097,026✔
3450
      continue;
×
3451
    }
3452

3453
    STR_TO_VARSTR(tName, pm->name);
27,097,026✔
3454

3455
    for (int32_t j = 0; j < pm->colNum; j++) {
262,093,632✔
3456
      // table name
3457
      SColumnInfoData *pColInfoData = taosArrayGet(p->pDataBlock, 0);
234,996,210✔
3458
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, tName, false), &lino, _OVER);
234,987,498✔
3459

3460
      // database name
3461
      pColInfoData = taosArrayGet(p->pDataBlock, 1);
234,993,834✔
3462
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, dName, false), &lino, _OVER);
234,992,844✔
3463

3464
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
234,991,458✔
3465
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, typeName, false), &lino, _OVER);
234,991,656✔
3466

3467
      // col name
3468
      char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
234,994,626✔
3469
      STR_TO_VARSTR(colName, pm->schema[j].name);
234,995,220✔
3470
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
234,992,052✔
3471
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, colName, false), &lino, _OVER);
234,979,974✔
3472

3473
      // col type
3474
      int8_t colType = pm->schema[j].type;
234,997,200✔
3475
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
234,997,596✔
3476
      char colTypeStr[VARSTR_HEADER_SIZE + 32];
234,994,824✔
3477
      int  colTypeLen =
234,894,438✔
3478
          tsnprintf(varDataVal(colTypeStr), sizeof(colTypeStr) - VARSTR_HEADER_SIZE, "%s", tDataTypes[colType].name);
234,995,022✔
3479
      if (colType == TSDB_DATA_TYPE_VARCHAR) {
234,894,438✔
3480
        colTypeLen +=
116,267,880✔
3481
            tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d)",
116,267,286✔
3482
                      (int32_t)(pm->schema[j].bytes - VARSTR_HEADER_SIZE));
116,261,346✔
3483
      } else if (colType == TSDB_DATA_TYPE_NCHAR) {
118,633,092✔
3484
        colTypeLen +=
×
3485
            tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d)",
×
3486
                      (int32_t)((pm->schema[j].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
×
3487
      }
3488
      varDataSetLen(colTypeStr, colTypeLen);
234,900,972✔
3489
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, (char *)colTypeStr, false), &lino, _OVER);
234,964,530✔
3490

3491
      // col length
3492
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
234,997,794✔
3493
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, (const char *)&pm->schema[j].bytes, false), &lino, _OVER);
234,996,804✔
3494

3495
      // col precision, col scale, col nullable, col source
3496
      for (int32_t k = 6; k <= 10; ++k) {
1,409,627,592✔
3497
        pColInfoData = taosArrayGet(p->pDataBlock, k);
1,173,214,098✔
3498
        colDataSetNULL(pColInfoData, numOfRows);
1,174,214,988✔
3499
      }
3500

3501
      numOfRows += 1;
236,413,494✔
3502
    }
3503
  }
3504
  return numOfRows;
985,962✔
3505
_OVER:
×
3506
  mError("failed at %s:%d since %s", __FUNCTION__, lino, tstrerror(code));
×
3507
  return numOfRows;
×
3508
}
3509
#define BUILD_COL_FOR_INFO_DB 1
3510
#define BUILD_COL_FOR_PERF_DB 1 << 1
3511
#define BUILD_COL_FOR_USER_DB 1 << 2
3512
#define BUILD_COL_FOR_ALL_DB  (BUILD_COL_FOR_INFO_DB | BUILD_COL_FOR_PERF_DB | BUILD_COL_FOR_USER_DB)
3513

3514
static int32_t buildSysDbColsInfo(SSDataBlock *p, int8_t buildWhichDBs, char *tb) {
525,580✔
3515
  size_t               size = 0;
525,580✔
3516
  const SSysTableMeta *pSysDbTableMeta = NULL;
525,580✔
3517

3518
  if (buildWhichDBs & BUILD_COL_FOR_INFO_DB) {
525,580✔
3519
    getInfosDbMeta(&pSysDbTableMeta, &size);
492,684✔
3520
    p->info.rows = buildDbColsInfoBlock(p, pSysDbTableMeta, size, TSDB_INFORMATION_SCHEMA_DB, tb);
492,684✔
3521
  }
3522

3523
  if (buildWhichDBs & BUILD_COL_FOR_PERF_DB) {
525,580✔
3524
    getPerfDbMeta(&pSysDbTableMeta, &size);
492,684✔
3525
    p->info.rows = buildDbColsInfoBlock(p, pSysDbTableMeta, size, TSDB_PERFORMANCE_SCHEMA_DB, tb);
492,684✔
3526
  }
3527

3528
  return p->info.rows;
525,580✔
3529
}
3530

3531
static int8_t determineBuildColForWhichDBs(const char *db) {
528,268✔
3532
  int8_t buildWhichDBs;
3533
  if (!db[0])
528,268✔
3534
    buildWhichDBs = BUILD_COL_FOR_ALL_DB;
492,572✔
3535
  else {
3536
    char *p = strchr(db, '.');
35,696✔
3537
    if (p && strcmp(p + 1, TSDB_INFORMATION_SCHEMA_DB) == 0) {
35,696✔
3538
      buildWhichDBs = BUILD_COL_FOR_INFO_DB;
112✔
3539
    } else if (p && strcmp(p + 1, TSDB_PERFORMANCE_SCHEMA_DB) == 0) {
35,584✔
3540
      buildWhichDBs = BUILD_COL_FOR_PERF_DB;
112✔
3541
    } else {
3542
      buildWhichDBs = BUILD_COL_FOR_USER_DB;
35,472✔
3543
    }
3544
  }
3545
  return buildWhichDBs;
528,268✔
3546
}
3547

3548
static int32_t mndRetrieveStbCol(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
528,268✔
3549
  uint8_t  buildWhichDBs;
3550
  SMnode  *pMnode = pReq->info.node;
528,268✔
3551
  SSdb    *pSdb = pMnode->pSdb;
528,268✔
3552
  SStbObj *pStb = NULL;
528,268✔
3553
  int32_t  numOfRows = 0;
528,268✔
3554
  int32_t  lino = 0;
528,268✔
3555
  int32_t  code = 0;
528,268✔
3556

3557
  buildWhichDBs = determineBuildColForWhichDBs(pShow->db);
528,268✔
3558

3559
  if (!pShow->sysDbRsp) {
528,268✔
3560
    numOfRows = buildSysDbColsInfo(pBlock, buildWhichDBs, pShow->filterTb);
525,580✔
3561
    mDebug("mndRetrieveStbCol get system table cols, rows:%d, db:%s", numOfRows, pShow->db);
525,382✔
3562
    pShow->sysDbRsp = true;
525,580✔
3563
  }
3564

3565
  if (buildWhichDBs & BUILD_COL_FOR_USER_DB) {
528,268✔
3566
    SDbObj *pDb = NULL;
528,044✔
3567
    if (strlen(pShow->db) > 0) {
528,044✔
3568
      pDb = mndAcquireDb(pMnode, pShow->db);
35,472✔
3569
      if (pDb == NULL && TSDB_CODE_MND_DB_NOT_EXIST != terrno && pBlock->info.rows == 0) return terrno;
35,472✔
3570
    }
3571

3572
    char typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
528,044✔
3573
    STR_TO_VARSTR(typeName, "SUPER_TABLE");
528,044✔
3574
    bool fetch = pShow->restore ? false : true;
528,044✔
3575
    pShow->restore = false;
528,044✔
3576
    while (numOfRows < rows) {
808,780✔
3577
      if (fetch) {
808,780✔
3578
        pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb);
806,092✔
3579
        if (pShow->pIter == NULL) break;
806,092✔
3580
      } else {
3581
        fetch = true;
2,688✔
3582
        void *pKey = taosHashGetKey(pShow->pIter, NULL);
2,688✔
3583
        pStb = sdbAcquire(pSdb, SDB_STB, pKey);
2,688✔
3584
        if (!pStb) continue;
2,688✔
3585
      }
3586

3587
      if (pDb != NULL && pStb->dbUid != pDb->uid) {
283,424✔
3588
        sdbRelease(pSdb, pStb);
1,344✔
3589
        continue;
1,344✔
3590
      }
3591

3592
      SName name = {0};
282,080✔
3593
      char  stbName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
282,080✔
3594
      mndExtractTbNameFromStbFullName(pStb->name, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN);
282,080✔
3595
      if (pShow->filterTb[0] && strncmp(pShow->filterTb, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN) != 0) {
282,080✔
3596
        sdbRelease(pSdb, pStb);
×
3597
        continue;
×
3598
      }
3599

3600
      if ((numOfRows + pStb->numOfColumns) > rows) {
282,080✔
3601
        pShow->restore = true;
2,688✔
3602
        if (numOfRows == 0) {
2,688✔
3603
          mError("mndRetrieveStbCol failed to get stable cols since buf:%d less than result:%d, stable name:%s, db:%s",
×
3604
                 rows, pStb->numOfColumns, pStb->name, pStb->db);
3605
        }
3606
        sdbRelease(pSdb, pStb);
2,688✔
3607
        break;
2,688✔
3608
      }
3609

3610
      varDataSetLen(stbName, strlen(&stbName[VARSTR_HEADER_SIZE]));
279,392✔
3611

3612
      mDebug("mndRetrieveStbCol get stable cols, stable name:%s, db:%s", pStb->name, pStb->db);
279,392✔
3613

3614
      char db[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
279,392✔
3615
      RETRIEVE_CHECK_GOTO(tNameFromString(&name, pStb->db, T_NAME_ACCT | T_NAME_DB), pStb, &lino, _OVER);
279,392✔
3616
      RETRIEVE_CHECK_GOTO(tNameGetDbName(&name, varDataVal(db)), pStb, &lino, _OVER);
279,392✔
3617
      varDataSetLen(db, strlen(varDataVal(db)));
279,392✔
3618

3619
      for (int i = 0; i < pStb->numOfColumns; i++) {
19,545,472✔
3620
        int32_t          cols = 0;
19,266,080✔
3621
        SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
19,266,080✔
3622
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stbName, false), pStb, &lino, _OVER);
19,266,080✔
3623

3624
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
19,266,080✔
3625
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)db, false), pStb, &lino, _OVER);
19,266,080✔
3626

3627
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
19,266,080✔
3628
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, typeName, false), pStb, &lino, _OVER);
19,266,080✔
3629

3630
        // col name
3631
        char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
19,266,080✔
3632
        STR_TO_VARSTR(colName, pStb->pColumns[i].name);
19,266,080✔
3633
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
19,266,080✔
3634
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, colName, false), pStb, &lino, _OVER);
19,266,080✔
3635

3636
        // col type
3637
        int8_t colType = pStb->pColumns[i].type;
19,266,080✔
3638
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
19,266,080✔
3639
        char colTypeStr[VARSTR_HEADER_SIZE + 32];
19,266,080✔
3640
        int  colTypeLen =
19,266,080✔
3641
            tsnprintf(varDataVal(colTypeStr), sizeof(colTypeStr) - VARSTR_HEADER_SIZE, "%s", tDataTypes[colType].name);
19,266,080✔
3642
        if (colType == TSDB_DATA_TYPE_VARCHAR) {
19,266,080✔
3643
          colTypeLen +=
193,836✔
3644
              tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE,
193,836✔
3645
                        "(%d)", (int32_t)(pStb->pColumns[i].bytes - VARSTR_HEADER_SIZE));
193,836✔
3646
        } else if (colType == TSDB_DATA_TYPE_NCHAR) {
19,072,244✔
3647
          colTypeLen +=
193,836✔
3648
              tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE,
193,836✔
3649
                        "(%d)", (int32_t)((pStb->pColumns[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
193,836✔
3650
        } else if (IS_DECIMAL_TYPE(colType)) {
18,878,408✔
3651
          STypeMod typeMod = pStb->pExtSchemas[i].typeMod;
×
3652
          uint8_t prec = 0, scale = 0;
×
3653
          decimalFromTypeMod(typeMod, &prec, &scale);
×
3654
          colTypeLen += sprintf(varDataVal(colTypeStr) + colTypeLen, "(%d,%d)", prec, scale);
×
3655
        }
3656
        varDataSetLen(colTypeStr, colTypeLen);
19,266,080✔
3657
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (char *)colTypeStr, false), pStb, &lino, _OVER);
19,266,080✔
3658

3659
        // col length
3660
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
19,266,080✔
3661
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->pColumns[i].bytes, false), pStb,
19,266,080✔
3662
                            &lino, _OVER);
3663
        
3664
        // col precision, col scale, col nullable, col source
3665
        for (int32_t j = 6; j <= 9; ++j) {
96,330,400✔
3666
          pColInfo = taosArrayGet(pBlock->pDataBlock, j);
77,064,320✔
3667
          colDataSetNULL(pColInfo, numOfRows);
77,064,320✔
3668
        }
3669

3670
        // col id
3671
        pColInfo = taosArrayGet(pBlock->pDataBlock, 10);
19,266,080✔
3672
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->pColumns[i].colId, false), pStb,
19,266,080✔
3673
                            &lino, _OVER);
3674
        numOfRows++;
19,266,080✔
3675
      }
3676

3677
      sdbRelease(pSdb, pStb);
279,392✔
3678
    }
3679

3680
    if (pDb != NULL) {
528,044✔
3681
      mndReleaseDb(pMnode, pDb);
35,132✔
3682
    }
3683
  }
3684

3685
  mDebug("mndRetrieveStbCol success, rows:%d, pShow->numOfRows:%d", numOfRows, pShow->numOfRows);
528,268✔
3686
  goto _OVER;
528,268✔
3687

3688
_ERROR:
3689
  mError("failed to mndRetrieveStbCol, rows:%d, pShow->numOfRows:%d, at %s:%d since %s", numOfRows, pShow->numOfRows,
3690
         __FUNCTION__, lino, tstrerror(code));
3691

3692
_OVER:
528,268✔
3693
  pShow->numOfRows += numOfRows;
528,268✔
3694
  return numOfRows;
528,268✔
3695
}
3696

3697
static void mndCancelGetNextStb(SMnode *pMnode, void *pIter) {
112✔
3698
  SSdb *pSdb = pMnode->pSdb;
112✔
3699
  sdbCancelFetchByType(pSdb, pIter, SDB_STB);
112✔
3700
}
112✔
3701

3702
const char *mndGetStbStr(const char *src) {
×
3703
  char *posDb = strstr(src, TS_PATH_DELIMITER);
×
3704
  if (posDb != NULL) ++posDb;
×
3705
  if (posDb == NULL) return src;
×
3706

3707
  char *posStb = strstr(posDb, TS_PATH_DELIMITER);
×
3708
  if (posStb != NULL) ++posStb;
×
3709
  if (posStb == NULL) return posDb;
×
3710
  return posStb;
×
3711
}
3712

3713
static int32_t mndCheckIndexReq(SCreateTagIndexReq *pReq) {
×
3714
  // impl
3715
  return TSDB_CODE_SUCCESS;
×
3716
}
3717

3718
/*int32_t mndAddIndexImpl(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp, void *sql,
3719
                        int32_t len) {
3720
  // impl later
3721
  int32_t code = 0;
3722
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "create-stb-index");
3723
  if (pTrans == NULL) goto _OVER;
3724

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

3729
  if (mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb) != 0) goto _OVER;
3730
  if (mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb) != 0) goto _OVER;
3731
  if (mndSetAlterStbRedoActions2(pMnode, pTrans, pDb, pStb, sql, len) != 0) goto _OVER;
3732
  if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
3733

3734
  return code;
3735

3736
_OVER:
3737
  mndTransDrop(pTrans);
3738
  return code;
3739
}
3740
static int32_t mndAddIndex(SMnode *pMnode, SRpcMsg *pReq, SCreateTagIndexReq *tagIdxReq, SDbObj *pDb, SStbObj *pOld) {
3741
  bool    needRsp = true;
3742
  int32_t code = -1;
3743
  SField *pField0 = NULL;
3744

3745
  SStbObj  stbObj = {0};
3746
  SStbObj *pNew = &stbObj;
3747

3748
  taosRLockLatch(&pOld->lock);
3749
  memcpy(&stbObj, pOld, sizeof(SStbObj));
3750
  taosRUnLockLatch(&pOld->lock);
3751

3752
  stbObj.pColumns = NULL;
3753
  stbObj.pTags = NULL;
3754
  stbObj.updateTime = taosGetTimestampMs();
3755
  stbObj.lock = 0;
3756

3757
  int32_t tag = mndFindSuperTableTagIndex(pOld, tagIdxReq->colName);
3758
  if (tag < 0) {
3759
    terrno = TSDB_CODE_MND_TAG_NOT_EXIST;
3760
    return -1;
3761
  }
3762
  if (mndAllocStbSchemas(pOld, pNew) != 0) {
3763
    return -1;
3764
  }
3765

3766
  SSchema *pTag = pNew->pTags + tag;
3767
  if (IS_IDX_ON(pTag)) {
3768
    terrno = TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST;
3769
    return -1;
3770
  } else {
3771
    pTag->flags |= COL_IDX_ON;
3772
  }
3773
  pNew->tagVer++;
3774

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

3777
  return code;
3778
}
3779
static int32_t mndProcessCreateIndexReq(SRpcMsg *pReq) {
3780
  SMnode            *pMnode = pReq->info.node;
3781
  int32_t            code = -1;
3782
  SDbObj            *pDb = NULL;
3783
  SStbObj           *pStb = NULL;
3784
  SCreateTagIndexReq tagIdxReq = {0};
3785

3786
  if (tDeserializeSCreateTagIdxReq(pReq->pCont, pReq->contLen, &tagIdxReq) != 0) {
3787
    terrno = TSDB_CODE_INVALID_MSG;
3788
    goto _OVER;
3789
  }
3790

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

3793
  if (mndCheckIndexReq(&tagIdxReq) != TSDB_CODE_SUCCESS) {
3794
    goto _OVER;
3795
  }
3796

3797
  pDb = mndAcquireDbByStb(pMnode, tagIdxReq.dbFName);
3798
  if (pDb == NULL) {
3799
    terrno = TSDB_CODE_MND_DB_NOT_EXIST;
3800
    goto _OVER;
3801
  }
3802

3803
  pStb = mndAcquireStb(pMnode, tagIdxReq.stbName);
3804
  if (pStb == NULL) {
3805
    terrno = TSDB_CODE_MND_STB_NOT_EXIST;
3806
    goto _OVER;
3807
  }
3808
  if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_WRITE_DB, pDb) != 0) {
3809
    goto _OVER;
3810
  }
3811

3812
  code = mndAddIndex(pMnode, pReq, &tagIdxReq, pDb, pStb);
3813
  if (terrno == TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST || terrno == TSDB_CODE_MND_TAG_NOT_EXIST) {
3814
    return terrno;
3815
  } else {
3816
    if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
3817
  }
3818
_OVER:
3819
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
3820
    mError("stb:%s, failed to create index since %s", tagIdxReq.stbName, terrstr());
3821
  }
3822
  mndReleaseStb(pMnode, pStb);
3823
  mndReleaseDb(pMnode, pDb);
3824
  return code;
3825
}
3826
static int32_t mndProcessDropIndexReq(SRpcMsg *pReq) {
3827
  SMnode          *pMnode = pReq->info.node;
3828
  int32_t          code = -1;
3829
  SDbObj          *pDb = NULL;
3830
  SStbObj         *pStb = NULL;
3831
  SDropTagIndexReq dropReq = {0};
3832
  if (tDeserializeSDropTagIdxReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
3833
    terrno = TSDB_CODE_INVALID_MSG;
3834
    goto _OVER;
3835
  }
3836
  //
3837
  return TSDB_CODE_SUCCESS;
3838
_OVER:
3839
  return code;
3840
}*/
3841

3842
static int32_t mndProcessDropStbReqFromMNode(SRpcMsg *pReq) {
×
3843
  int32_t code = mndProcessDropStbReq(pReq);
×
3844
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
×
3845
    pReq->info.rsp = rpcMallocCont(1);
×
3846
    pReq->info.rspLen = 1;
×
3847
    pReq->info.noResp = false;
×
3848
    pReq->code = code;
×
3849
  }
3850
  return code;
×
3851
}
3852

3853
typedef struct SVDropTbVgReqs {
3854
  SArray     *pBatchReqs;
3855
  SVgroupInfo info;
3856
} SVDropTbVgReqs;
3857

3858
typedef struct SMDropTbDbInfo {
3859
  SArray *dbVgInfos;
3860
  int32_t hashPrefix;
3861
  int32_t hashSuffix;
3862
  int32_t hashMethod;
3863
} SMDropTbDbInfo;
3864

3865
typedef struct SMDropTbTsmaInfo {
3866
  char           tsmaResTbDbFName[TSDB_DB_FNAME_LEN];
3867
  char           tsmaResTbNamePrefix[TSDB_TABLE_FNAME_LEN];
3868
  int32_t        suid;
3869
  SMDropTbDbInfo dbInfo;  // reference to DbInfo in pDbMap
3870
} SMDropTbTsmaInfo;
3871

3872
typedef struct SMDropTbTsmaInfos {
3873
  SArray *pTsmaInfos;  // SMDropTbTsmaInfo
3874
} SMDropTbTsmaInfos;
3875

3876
typedef struct SMndDropTbsWithTsmaCtx {
3877
  SHashObj *pVgMap;  // <vgId, SVDropTbVgReqs>
3878
} SMndDropTbsWithTsmaCtx;
3879

3880
static int32_t mndDropTbForSingleVg(SMnode *pMnode, SMndDropTbsWithTsmaCtx *pCtx, SArray *pTbs, int32_t vgId);
3881

3882
static void destroySVDropTbBatchReqs(void *p);
3883
static void mndDestroyDropTbsWithTsmaCtx(SMndDropTbsWithTsmaCtx *p) {
12,207✔
3884
  if (!p) return;
12,207✔
3885

3886
  if (p->pVgMap) {
12,207✔
3887
    void *pIter = taosHashIterate(p->pVgMap, NULL);
12,207✔
3888
    while (pIter) {
24,414✔
3889
      SVDropTbVgReqs *pReqs = pIter;
12,207✔
3890
      taosArrayDestroyEx(pReqs->pBatchReqs, destroySVDropTbBatchReqs);
12,207✔
3891
      pIter = taosHashIterate(p->pVgMap, pIter);
12,207✔
3892
    }
3893
    taosHashCleanup(p->pVgMap);
12,207✔
3894
  }
3895
  taosMemoryFree(p);
12,207✔
3896
}
3897

3898
static int32_t mndInitDropTbsWithTsmaCtx(SMndDropTbsWithTsmaCtx **ppCtx) {
12,207✔
3899
  int32_t                 code = 0;
12,207✔
3900
  SMndDropTbsWithTsmaCtx *pCtx = taosMemoryCalloc(1, sizeof(SMndDropTbsWithTsmaCtx));
12,207✔
3901
  if (!pCtx) return terrno;
12,207✔
3902

3903
  pCtx->pVgMap = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_NO_LOCK);
12,207✔
3904
  if (!pCtx->pVgMap) {
12,207✔
3905
    code = terrno;
×
3906
    goto _end;
×
3907
  }
3908

3909
  *ppCtx = pCtx;
12,207✔
3910
_end:
12,207✔
3911
  if (code) mndDestroyDropTbsWithTsmaCtx(pCtx);
12,207✔
3912
  return code;
12,207✔
3913
}
3914

3915
static void *mndBuildVDropTbsReq(SMnode *pMnode, const SVgroupInfo *pVgInfo, const SVDropTbBatchReq *pReq,
35,308✔
3916
                                 int32_t *len) {
3917
  int32_t   contLen = 0;
35,308✔
3918
  int32_t   ret = 0;
35,308✔
3919
  SMsgHead *pHead = NULL;
35,308✔
3920
  SEncoder  encoder = {0};
35,308✔
3921

3922
  tEncodeSize(tEncodeSVDropTbBatchReq, pReq, contLen, ret);
35,308✔
3923
  if (ret < 0) return NULL;
35,308✔
3924

3925
  contLen += sizeof(SMsgHead);
35,308✔
3926
  pHead = taosMemoryMalloc(contLen);
35,308✔
3927
  if (pHead == NULL) {
35,308✔
3928
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
3929
    return NULL;
×
3930
  }
3931

3932
  pHead->contLen = htonl(contLen);
35,308✔
3933
  pHead->vgId = htonl(pVgInfo->vgId);
35,308✔
3934

3935
  void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
35,308✔
3936

3937
  tEncoderInit(&encoder, pBuf, contLen - sizeof(SMsgHead));
35,308✔
3938
  int32_t code = tEncodeSVDropTbBatchReq(&encoder, pReq);
35,308✔
3939
  tEncoderClear(&encoder);
35,308✔
3940
  if (code != 0) return NULL;
35,308✔
3941

3942
  *len = contLen;
35,308✔
3943
  return pHead;
35,308✔
3944
}
3945

3946
static int32_t mndSetDropTbsRedoActions(SMnode *pMnode, STrans *pTrans, const SVDropTbVgReqs *pVgReqs, void *pCont,
35,308✔
3947
                                        int32_t contLen, tmsg_t msgType) {
3948
  STransAction action = {0};
35,308✔
3949
  action.epSet = pVgReqs->info.epSet;
35,308✔
3950
  action.pCont = pCont;
35,308✔
3951
  action.contLen = contLen;
35,308✔
3952
  action.msgType = msgType;
35,308✔
3953
  action.acceptableCode = TSDB_CODE_TDB_TABLE_NOT_EXIST;
35,308✔
3954
  return mndTransAppendRedoAction(pTrans, &action);
35,308✔
3955
}
3956

3957
static int32_t mndBuildDropTbRedoActions(SMnode *pMnode, STrans *pTrans, SHashObj *pVgMap, tmsg_t msgType) {
8,827✔
3958
  int32_t code = 0;
8,827✔
3959
  void   *pIter = taosHashIterate(pVgMap, NULL);
8,827✔
3960
  while (pIter) {
17,654✔
3961
    const SVDropTbVgReqs *pVgReqs = pIter;
8,827✔
3962
    int32_t               len = 0;
8,827✔
3963
    for (int32_t i = 0; i < taosArrayGetSize(pVgReqs->pBatchReqs) && code == TSDB_CODE_SUCCESS; ++i) {
44,135✔
3964
      SVDropTbBatchReq *pBatchReq = taosArrayGet(pVgReqs->pBatchReqs, i);
35,308✔
3965
      void             *p = mndBuildVDropTbsReq(pMnode, &pVgReqs->info, pBatchReq, &len);
35,308✔
3966
      if (!p) {
35,308✔
3967
        code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
3968
        if (terrno != 0) code = terrno;
×
3969
        break;
×
3970
      }
3971
      if ((code = mndSetDropTbsRedoActions(pMnode, pTrans, pVgReqs, p, len, msgType)) != 0) {
35,308✔
3972
        break;
×
3973
      }
3974
    }
3975
    if (TSDB_CODE_SUCCESS != code) {
8,827✔
3976
      taosHashCancelIterate(pVgMap, pIter);
×
3977
      break;
×
3978
    }
3979
    pIter = taosHashIterate(pVgMap, pIter);
8,827✔
3980
  }
3981
  return code;
8,827✔
3982
}
3983

3984
static int32_t mndCreateDropTbsTxnPrepare(SRpcMsg *pRsp, SMndDropTbsWithTsmaCtx *pCtx) {
12,207✔
3985
  int32_t code = 0;
12,207✔
3986
  SMnode *pMnode = pRsp->info.node;
12,207✔
3987
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, pRsp, "drop-tbs");
12,207✔
3988
  mndTransSetChangeless(pTrans);
12,207✔
3989
  mndTransSetSerial(pTrans);
12,207✔
3990
  if (pTrans == NULL) {
12,207✔
3991
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
3992
    if (terrno != 0) code = terrno;
×
3993
    goto _OVER;
×
3994
  }
3995

3996
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
12,207✔
3997

3998
  if ((code = mndBuildDropTbRedoActions(pMnode, pTrans, pCtx->pVgMap, TDMT_VND_DROP_TABLE)) != 0) goto _OVER;
8,827✔
3999
  if ((code = mndTransPrepare(pMnode, pTrans)) != 0) goto _OVER;
8,827✔
4000

4001
_OVER:
8,827✔
4002
  mndTransDrop(pTrans);
12,207✔
4003
  TAOS_RETURN(code);
12,207✔
4004
}
4005

4006
static int32_t mndProcessDropTbWithTsma(SRpcMsg *pReq) {
×
4007
  int32_t      code = -1;
×
4008
  SMnode      *pMnode = pReq->info.node;
×
4009
  SDbObj      *pDb = NULL;
×
4010
  SStbObj     *pStb = NULL;
×
4011
  SMDropTbsReq dropReq = {0};
×
4012
  bool         locked = false;
×
4013
  if (tDeserializeSMDropTbsReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
×
4014
    code = TSDB_CODE_INVALID_MSG;
×
4015
    goto _OVER;
×
4016
  }
4017

4018
  SMndDropTbsWithTsmaCtx *pCtx = NULL;
×
4019
  code = mndInitDropTbsWithTsmaCtx(&pCtx);
×
4020
  if (code) goto _OVER;
×
4021
  for (int32_t i = 0; i < dropReq.pVgReqs->size; ++i) {
×
4022
    SMDropTbReqsOnSingleVg *pReq = taosArrayGet(dropReq.pVgReqs, i);
×
4023
    code = mndDropTbForSingleVg(pMnode, pCtx, pReq->pTbs, pReq->vgInfo.vgId);
×
4024
    if (code) goto _OVER;
×
4025
  }
4026
  code = mndCreateDropTbsTxnPrepare(pReq, pCtx);
×
4027
  if (code == 0) {
×
4028
    code = TSDB_CODE_ACTION_IN_PROGRESS;
×
4029
  }
4030
_OVER:
×
4031
  tFreeSMDropTbsReq(&dropReq);
×
4032
  if (pCtx) mndDestroyDropTbsWithTsmaCtx(pCtx);
×
4033
  TAOS_RETURN(code);
×
4034
}
4035

4036
static int32_t createDropTbBatchReq(const SVDropTbReq *pReq, SVDropTbBatchReq *pBatchReq) {
49,504✔
4037
  pBatchReq->nReqs = 1;
49,504✔
4038
  pBatchReq->pArray = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SVDropTbReq));
49,504✔
4039
  if (!pBatchReq->pArray) return terrno;
49,504✔
4040
  if (taosArrayPush(pBatchReq->pArray, pReq) == NULL) {
99,008✔
4041
    taosArrayDestroy(pBatchReq->pArray);
×
4042
    pBatchReq->pArray = NULL;
×
4043
    return terrno;
×
4044
  }
4045
  return TSDB_CODE_SUCCESS;
49,504✔
4046
}
4047

4048
static void destroySVDropTbBatchReqs(void *p) {
49,504✔
4049
  SVDropTbBatchReq *pReq = p;
49,504✔
4050
  taosArrayDestroy(pReq->pArray);
49,504✔
4051
  pReq->pArray = NULL;
49,504✔
4052
}
49,504✔
4053

4054
static int32_t mndDropTbAdd(SMnode *pMnode, SHashObj *pVgHashMap, const SVgroupInfo *pVgInfo, char *name, tb_uid_t suid,
49,504✔
4055
                            bool ignoreNotExists) {
4056
  SVDropTbReq req = {.name = name, .suid = suid, .igNotExists = ignoreNotExists, .uid = 0};
49,504✔
4057

4058
  SVDropTbVgReqs *pVgReqs = taosHashGet(pVgHashMap, &pVgInfo->vgId, sizeof(pVgInfo->vgId));
49,504✔
4059
  SVDropTbVgReqs  vgReqs = {0};
49,504✔
4060
  if (pVgReqs == NULL) {
49,504✔
4061
    vgReqs.info = *pVgInfo;
12,207✔
4062
    vgReqs.pBatchReqs = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SVDropTbBatchReq));
12,207✔
4063
    if (!vgReqs.pBatchReqs) return terrno;
12,207✔
4064
    SVDropTbBatchReq batchReq = {0};
12,207✔
4065
    int32_t          code = createDropTbBatchReq(&req, &batchReq);
12,207✔
4066
    if (TSDB_CODE_SUCCESS != code) return code;
12,207✔
4067
    if (taosArrayPush(vgReqs.pBatchReqs, &batchReq) == NULL) {
24,414✔
4068
      taosArrayDestroy(batchReq.pArray);
×
4069
      return terrno;
×
4070
    }
4071
    if (taosHashPut(pVgHashMap, &pVgInfo->vgId, sizeof(pVgInfo->vgId), &vgReqs, sizeof(vgReqs)) != 0) {
12,207✔
4072
      taosArrayDestroyEx(vgReqs.pBatchReqs, destroySVDropTbBatchReqs);
×
4073
      return terrno;
×
4074
    }
4075
  } else {
4076
    SVDropTbBatchReq batchReq = {0};
37,297✔
4077
    int32_t          code = createDropTbBatchReq(&req, &batchReq);
37,297✔
4078
    if (TSDB_CODE_SUCCESS != code) return code;
37,297✔
4079
    if (taosArrayPush(pVgReqs->pBatchReqs, &batchReq) == NULL) {
74,594✔
4080
      taosArrayDestroy(batchReq.pArray);
×
4081
      return terrno;
×
4082
    }
4083
  }
4084
  return 0;
49,504✔
4085
}
4086

4087
static int32_t mndDropTbForSingleVg(SMnode *pMnode, SMndDropTbsWithTsmaCtx *pCtx, SArray *pTbs, int32_t vgId) {
12,207✔
4088
  int32_t code = 0;
12,207✔
4089

4090
  SVgObj *pVgObj = mndAcquireVgroup(pMnode, vgId);
12,207✔
4091
  if (!pVgObj) {
12,207✔
4092
    code = 0;
×
4093
    goto _end;
×
4094
  }
4095
  SVgroupInfo vgInfo = {.hashBegin = pVgObj->hashBegin,
24,414✔
4096
                        .hashEnd = pVgObj->hashEnd,
12,207✔
4097
                        .numOfTable = pVgObj->numOfTables,
12,207✔
4098
                        .vgId = pVgObj->vgId};
12,207✔
4099
  vgInfo.epSet = mndGetVgroupEpset(pMnode, pVgObj);
12,207✔
4100
  mndReleaseVgroup(pMnode, pVgObj);
12,207✔
4101

4102
  for (int32_t i = 0; i < pTbs->size; ++i) {
61,711✔
4103
    SVDropTbReq *pTb = taosArrayGet(pTbs, i);
49,504✔
4104
    TAOS_CHECK_GOTO(mndDropTbAdd(pMnode, pCtx->pVgMap, &vgInfo, pTb->name, pTb->suid, pTb->igNotExists), NULL, _end);
49,504✔
4105
  }
4106
_end:
12,207✔
4107
  return code;
12,207✔
4108
}
4109

4110
static int32_t mndProcessFetchTtlExpiredTbs(SRpcMsg *pRsp) {
7,512,129✔
4111
  int32_t                 code = -1;
7,512,129✔
4112
  SDecoder                decoder = {0};
7,512,129✔
4113
  SMnode                 *pMnode = pRsp->info.node;
7,512,129✔
4114
  SVFetchTtlExpiredTbsRsp rsp = {0};
7,512,129✔
4115
  SMndDropTbsWithTsmaCtx *pCtx = NULL;
7,512,129✔
4116
  if (pRsp->code != TSDB_CODE_SUCCESS) {
7,512,129✔
4117
    code = pRsp->code;
87,760✔
4118
    goto _end;
87,760✔
4119
  }
4120
  if (pRsp->contLen == 0) {
7,424,369✔
4121
    code = 0;
7,412,162✔
4122
    goto _end;
7,412,162✔
4123
  }
4124

4125
  tDecoderInit(&decoder, pRsp->pCont, pRsp->contLen);
12,207✔
4126
  code = tDecodeVFetchTtlExpiredTbsRsp(&decoder, &rsp);
12,207✔
4127
  if (code) goto _end;
12,207✔
4128

4129
  code = mndInitDropTbsWithTsmaCtx(&pCtx);
12,207✔
4130
  if (code) goto _end;
12,207✔
4131

4132
  code = mndDropTbForSingleVg(pMnode, pCtx, rsp.pExpiredTbs, rsp.vgId);
12,207✔
4133
  if (code) goto _end;
12,207✔
4134
  code = mndCreateDropTbsTxnPrepare(pRsp, pCtx);
12,207✔
4135
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
12,207✔
4136
_end:
7,511,638✔
4137
  if (pCtx) mndDestroyDropTbsWithTsmaCtx(pCtx);
7,512,129✔
4138
  tDecoderClear(&decoder);
7,512,129✔
4139
  tFreeFetchTtlExpiredTbsRsp(&rsp);
7,512,129✔
4140
  TAOS_RETURN(code);
7,512,129✔
4141
}
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