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

taosdata / TDengine / #5029

21 Apr 2026 10:00AM UTC coverage: 73.003% (+0.02%) from 72.986%
#5029

push

travis-ci

web-flow
fix(tmq): balance vgroup error (#35183)

273843 of 375111 relevant lines covered (73.0%)

134074995.07 hits per line

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

78.49
/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_SUPPORT_COMP    2
38
#define STB_VER_SUPPORT_VIRTUAL 3
39
#define STB_VER_SUPPORT_OWNER   4
40
#define STB_VER_NUMBER          STB_VER_SUPPORT_OWNER
41
#define STB_RESERVE_SIZE        55
42

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

64
static int32_t mndProcessCreateIndexReq(SRpcMsg *pReq);
65
static int32_t mndProcessDropIndexReq(SRpcMsg *pReq);
66

67
static int32_t mndProcessDropStbReqFromMNode(SRpcMsg *pReq);
68
static int32_t mndProcessDropTbWithTsma(SRpcMsg *pReq);
69
static int32_t mndProcessFetchTtlExpiredTbs(SRpcMsg *pReq);
70
static int32_t mndProcessAuditRecordRsp(SRpcMsg *pRsp);
71

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

83
  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_STB, mndProcessCreateStbReq);
474,007✔
84
  mndSetMsgHandle(pMnode, TDMT_MND_ALTER_STB, mndProcessAlterStbReq);
474,007✔
85
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_STB, mndProcessDropStbReq);
474,007✔
86
  mndSetMsgHandle(pMnode, TDMT_VND_CREATE_STB_RSP, mndTransProcessRsp);
474,007✔
87
  mndSetMsgHandle(pMnode, TDMT_VND_DROP_TTL_TABLE_RSP, mndProcessDropTtltbRsp);
474,007✔
88
  mndSetMsgHandle(pMnode, TDMT_VND_TRIM_RSP, mndTransProcessRsp);
474,007✔
89
  mndSetMsgHandle(pMnode, TDMT_VND_TRIM_WAL_RSP, mndProcessTrimDbWalRsp);
474,007✔
90
  mndSetMsgHandle(pMnode, TDMT_VND_ALTER_STB_RSP, mndTransProcessRsp);
474,007✔
91
  mndSetMsgHandle(pMnode, TDMT_VND_DROP_STB_RSP, mndTransProcessRsp);
474,007✔
92
  mndSetMsgHandle(pMnode, TDMT_MND_TABLE_META, mndProcessTableMetaReq);
474,007✔
93
  mndSetMsgHandle(pMnode, TDMT_MND_TTL_TIMER, mndProcessTtlTimer);
474,007✔
94
  // mndSetMsgHandle(pMnode, TDMT_MND_TRIM_DB_TIMER, mndProcessTrimDbTimer);
95
  mndSetMsgHandle(pMnode, TDMT_MND_TABLE_CFG, mndProcessTableCfgReq);
474,007✔
96
  mndSetMsgHandle(pMnode, TDMT_MND_STB_DROP, mndProcessDropStbReqFromMNode);
474,007✔
97
  mndSetMsgHandle(pMnode, TDMT_MND_STB_DROP_RSP, mndTransProcessRsp);
474,007✔
98
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_TB_WITH_TSMA, mndProcessDropTbWithTsma);
474,007✔
99
  mndSetMsgHandle(pMnode, TDMT_VND_FETCH_TTL_EXPIRED_TBS_RSP, mndProcessFetchTtlExpiredTbs);
474,007✔
100
  mndSetMsgHandle(pMnode, TDMT_VND_DROP_TABLE_RSP, mndTransProcessRsp);
474,007✔
101
  mndSetMsgHandle(pMnode, TDMT_VND_CREATE_TABLE_RSP, mndTransProcessRsp);
474,007✔
102

103
  //  mndSetMsgHandle(pMnode, TDMT_MND_SYSTABLE_RETRIEVE, mndProcessRetrieveStbReq);
104

105
  // mndSetMsgHandle(pMnode, TDMT_MND_CREATE_INDEX, mndProcessCreateIndexReq);
106
  // mndSetMsgHandle(pMnode, TDMT_MND_DROP_INDEX, mndProcessDropIndexReq);
107
  // mndSetMsgHandle(pMnode, TDMT_VND_CREATE_INDEX_RSP, mndTransProcessRsp);
108
  // mndSetMsgHandle(pMnode, TDMT_VND_DROP_INDEX_RSP, mndTransProcessRsp);
109
  mndSetMsgHandle(pMnode, TDMT_VND_AUDIT_RECORD_RSP, mndProcessAuditRecordRsp);
474,007✔
110

111
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STB, mndRetrieveStb);
474,007✔
112
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_STB, mndCancelGetNextStb);
474,007✔
113

114
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_COL, mndRetrieveStbCol);
474,007✔
115
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_COL, mndCancelGetNextStb);
474,007✔
116

117
  return sdbSetTable(pMnode->pSdb, table);
474,007✔
118
}
119

120
void mndCleanupStb(SMnode *pMnode) {}
473,946✔
121

122
SSdbRaw *mndStbActionEncode(SStbObj *pStb) {
16,488,372✔
123
  int32_t code = 0;
16,488,372✔
124
  int32_t lino = 0;
16,488,372✔
125
  bool    hasTypeMod = false;
16,488,372✔
126
  terrno = TSDB_CODE_OUT_OF_MEMORY;
16,488,372✔
127

128
  int32_t size = sizeof(SStbObj) + (pStb->numOfColumns + pStb->numOfTags) * sizeof(SSchema) + pStb->commentLen +
16,500,878✔
129
                 pStb->ast1Len + pStb->ast2Len + pStb->numOfColumns * sizeof(SColCmpr) + STB_RESERVE_SIZE +
16,500,878✔
130
                 taosArrayGetSize(pStb->pFuncs) * TSDB_FUNC_NAME_LEN + sizeof(int32_t) * pStb->numOfColumns;
16,488,372✔
131
  SSdbRaw *pRaw = sdbAllocRaw(SDB_STB, STB_VER_NUMBER, size);
16,488,372✔
132
  if (pRaw == NULL) goto _OVER;
16,488,372✔
133

134
  int32_t dataPos = 0;
16,488,372✔
135
  SDB_SET_BINARY(pRaw, dataPos, pStb->name, TSDB_TABLE_FNAME_LEN, _OVER)
16,488,372✔
136
  SDB_SET_BINARY(pRaw, dataPos, pStb->db, TSDB_DB_FNAME_LEN, _OVER)
16,488,372✔
137
  SDB_SET_INT64(pRaw, dataPos, pStb->createdTime, _OVER)
16,488,372✔
138
  SDB_SET_INT64(pRaw, dataPos, pStb->updateTime, _OVER)
16,488,372✔
139
  SDB_SET_INT64(pRaw, dataPos, pStb->uid, _OVER)
16,488,372✔
140
  SDB_SET_INT64(pRaw, dataPos, pStb->dbUid, _OVER)
16,488,372✔
141
  SDB_SET_INT32(pRaw, dataPos, pStb->tagVer, _OVER)
16,488,372✔
142
  SDB_SET_INT32(pRaw, dataPos, pStb->colVer, _OVER)
16,488,372✔
143
  SDB_SET_INT32(pRaw, dataPos, pStb->smaVer, _OVER)
16,488,372✔
144
  SDB_SET_INT32(pRaw, dataPos, pStb->nextColId, _OVER)
16,488,372✔
145
  SDB_SET_INT64(pRaw, dataPos, pStb->maxdelay[0], _OVER)
16,488,372✔
146
  SDB_SET_INT64(pRaw, dataPos, pStb->maxdelay[1], _OVER)
16,488,372✔
147
  SDB_SET_INT64(pRaw, dataPos, pStb->watermark[0], _OVER)
16,488,372✔
148
  SDB_SET_INT64(pRaw, dataPos, pStb->watermark[1], _OVER)
16,488,372✔
149
  SDB_SET_INT32(pRaw, dataPos, pStb->ttl, _OVER)
16,488,372✔
150
  SDB_SET_INT32(pRaw, dataPos, pStb->numOfColumns, _OVER)
16,488,372✔
151
  SDB_SET_INT32(pRaw, dataPos, pStb->numOfTags, _OVER)
16,488,372✔
152
  SDB_SET_INT32(pRaw, dataPos, pStb->numOfFuncs, _OVER)
16,488,372✔
153
  SDB_SET_INT32(pRaw, dataPos, pStb->commentLen, _OVER)
16,488,372✔
154
  SDB_SET_INT32(pRaw, dataPos, pStb->ast1Len, _OVER)
16,488,372✔
155
  SDB_SET_INT32(pRaw, dataPos, pStb->ast2Len, _OVER)
16,488,372✔
156

157
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
942,662,481✔
158
    SSchema *pSchema = &pStb->pColumns[i];
926,174,109✔
159
    SDB_SET_INT8(pRaw, dataPos, pSchema->type, _OVER)
926,174,109✔
160
    SDB_SET_INT8(pRaw, dataPos, pSchema->flags, _OVER)
926,174,109✔
161
    SDB_SET_INT16(pRaw, dataPos, pSchema->colId, _OVER)
926,174,109✔
162
    SDB_SET_INT32(pRaw, dataPos, pSchema->bytes, _OVER)
926,174,109✔
163
    SDB_SET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
926,174,109✔
164
    hasTypeMod = hasTypeMod || HAS_TYPE_MOD(pSchema);
926,174,109✔
165
  }
166

167
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
117,022,905✔
168
    SSchema *pSchema = &pStb->pTags[i];
100,534,533✔
169
    SDB_SET_INT8(pRaw, dataPos, pSchema->type, _OVER)
100,534,533✔
170
    SDB_SET_INT8(pRaw, dataPos, pSchema->flags, _OVER)
100,534,533✔
171
    SDB_SET_INT16(pRaw, dataPos, pSchema->colId, _OVER)
100,534,533✔
172
    SDB_SET_INT32(pRaw, dataPos, pSchema->bytes, _OVER)
100,534,533✔
173
    SDB_SET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
100,534,533✔
174
  }
175

176
  for (int32_t i = 0; i < pStb->numOfFuncs; ++i) {
16,488,372✔
177
    char *func = taosArrayGet(pStb->pFuncs, i);
×
178
    SDB_SET_BINARY(pRaw, dataPos, func, TSDB_FUNC_NAME_LEN, _OVER)
×
179
  }
180

181
  if (pStb->commentLen > 0) {
16,488,372✔
182
    SDB_SET_BINARY(pRaw, dataPos, pStb->comment, pStb->commentLen + 1, _OVER)
66,854✔
183
  }
184

185
  if (pStb->ast1Len > 0) {
16,488,372✔
186
    SDB_SET_BINARY(pRaw, dataPos, pStb->pAst1, pStb->ast1Len, _OVER)
×
187
  }
188

189
  if (pStb->ast2Len > 0) {
16,488,372✔
190
    SDB_SET_BINARY(pRaw, dataPos, pStb->pAst2, pStb->ast2Len, _OVER)
×
191
  }
192

193
  if (pStb->pCmpr != NULL) {
16,488,372✔
194
    for (int i = 0; i < pStb->numOfColumns; i++) {
942,662,481✔
195
      SColCmpr *p = &pStb->pCmpr[i];
926,174,109✔
196
      SDB_SET_INT16(pRaw, dataPos, p->id, _OVER)
926,174,109✔
197
      SDB_SET_INT32(pRaw, dataPos, p->alg, _OVER)
926,174,109✔
198
    }
199
  }
200
  SDB_SET_INT64(pRaw, dataPos, pStb->keep, _OVER)
16,488,372✔
201

202
  if (hasTypeMod) {
16,488,372✔
203
    for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
564,644,943✔
204
      SDB_SET_INT32(pRaw, dataPos, pStb->pExtSchemas[i].typeMod, _OVER);
559,064,736✔
205
    }
206
  }
207

208
  SDB_SET_INT8(pRaw, dataPos, pStb->virtualStb, _OVER)
16,488,372✔
209
  // since 3.4.0.0 - STB_VER_SUPPORT_OWNER
210
  SDB_SET_BINARY(pRaw, dataPos, pStb->createUser, TSDB_USER_LEN, _OVER)
16,488,372✔
211
  SDB_SET_INT64(pRaw, dataPos, pStb->ownerId, _OVER)
16,488,372✔
212
  SDB_SET_INT8(pRaw, dataPos, pStb->secureDelete, _OVER)
16,488,372✔
213
  SDB_SET_RESERVE(pRaw, dataPos, STB_RESERVE_SIZE, _OVER)
16,488,372✔
214
  SDB_SET_DATALEN(pRaw, dataPos, _OVER)
16,488,372✔
215

216
  terrno = 0;
16,488,372✔
217

218
_OVER:
16,488,372✔
219
  if (terrno != 0) {
16,488,372✔
220
    mError("stb:%s, failed to encode to raw:%p since %s", pStb->name, pRaw, terrstr());
×
221
    sdbFreeRaw(pRaw);
×
222
    return NULL;
×
223
  }
224

225
  mTrace("stb:%s, encode to raw:%p, row:%p", pStb->name, pRaw, pStb);
16,488,372✔
226
  return pRaw;
16,488,372✔
227
}
228

229
SSdbRow *mndStbActionDecode(SSdbRaw *pRaw) {
16,011,026✔
230
  int32_t code = 0;
16,011,026✔
231
  int32_t lino = 0;
16,011,026✔
232
  terrno = TSDB_CODE_OUT_OF_MEMORY;
16,011,026✔
233
  SSdbRow *pRow = NULL;
16,011,026✔
234
  SStbObj *pStb = NULL;
16,011,026✔
235
  bool     hasExtSchemas = false;
16,011,026✔
236

237
  int8_t sver = 0;
16,011,026✔
238
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
16,011,026✔
239

240
  if (sver > STB_VER_NUMBER) {
16,011,026✔
241
    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
×
242
    goto _OVER;
×
243
  }
244

245
  pRow = sdbAllocRow(sizeof(SStbObj));
16,011,026✔
246
  if (pRow == NULL) goto _OVER;
16,011,026✔
247

248
  pStb = sdbGetRowObj(pRow);
16,011,026✔
249
  if (pStb == NULL) goto _OVER;
16,011,026✔
250

251
  int32_t dataPos = 0;
16,011,026✔
252
  SDB_GET_BINARY(pRaw, dataPos, pStb->name, TSDB_TABLE_FNAME_LEN, _OVER)
16,011,026✔
253
  SDB_GET_BINARY(pRaw, dataPos, pStb->db, TSDB_DB_FNAME_LEN, _OVER)
16,011,026✔
254
  SDB_GET_INT64(pRaw, dataPos, &pStb->createdTime, _OVER)
16,011,026✔
255
  SDB_GET_INT64(pRaw, dataPos, &pStb->updateTime, _OVER)
16,011,026✔
256
  SDB_GET_INT64(pRaw, dataPos, &pStb->uid, _OVER)
16,011,026✔
257
  SDB_GET_INT64(pRaw, dataPos, &pStb->dbUid, _OVER)
16,011,026✔
258
  SDB_GET_INT32(pRaw, dataPos, &pStb->tagVer, _OVER)
16,011,026✔
259
  SDB_GET_INT32(pRaw, dataPos, &pStb->colVer, _OVER)
16,011,026✔
260
  SDB_GET_INT32(pRaw, dataPos, &pStb->smaVer, _OVER)
16,011,026✔
261
  SDB_GET_INT32(pRaw, dataPos, &pStb->nextColId, _OVER)
16,011,026✔
262
  SDB_GET_INT64(pRaw, dataPos, &pStb->maxdelay[0], _OVER)
16,011,026✔
263
  SDB_GET_INT64(pRaw, dataPos, &pStb->maxdelay[1], _OVER)
16,011,026✔
264
  SDB_GET_INT64(pRaw, dataPos, &pStb->watermark[0], _OVER)
16,011,026✔
265
  SDB_GET_INT64(pRaw, dataPos, &pStb->watermark[1], _OVER)
16,011,026✔
266
  SDB_GET_INT32(pRaw, dataPos, &pStb->ttl, _OVER)
16,011,026✔
267
  SDB_GET_INT32(pRaw, dataPos, &pStb->numOfColumns, _OVER)
16,011,026✔
268
  SDB_GET_INT32(pRaw, dataPos, &pStb->numOfTags, _OVER)
16,011,026✔
269
  SDB_GET_INT32(pRaw, dataPos, &pStb->numOfFuncs, _OVER)
16,011,026✔
270
  SDB_GET_INT32(pRaw, dataPos, &pStb->commentLen, _OVER)
16,011,026✔
271
  SDB_GET_INT32(pRaw, dataPos, &pStb->ast1Len, _OVER)
16,011,026✔
272
  SDB_GET_INT32(pRaw, dataPos, &pStb->ast2Len, _OVER)
16,011,026✔
273

274
  pStb->pColumns = taosMemoryCalloc(pStb->numOfColumns, sizeof(SSchema));
16,011,026✔
275
  pStb->pTags = taosMemoryCalloc(pStb->numOfTags, sizeof(SSchema));
16,011,026✔
276
  pStb->pFuncs = taosArrayInit(pStb->numOfFuncs, TSDB_FUNC_NAME_LEN);
16,011,026✔
277
  if (pStb->pColumns == NULL || pStb->pTags == NULL || pStb->pFuncs == NULL) {
16,011,026✔
278
    goto _OVER;
×
279
  }
280

281
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
1,452,610,810✔
282
    SSchema *pSchema = &pStb->pColumns[i];
1,436,599,784✔
283
    SDB_GET_INT8(pRaw, dataPos, &pSchema->type, _OVER)
1,436,599,784✔
284
    SDB_GET_INT8(pRaw, dataPos, &pSchema->flags, _OVER)
1,436,599,784✔
285
    SDB_GET_INT16(pRaw, dataPos, &pSchema->colId, _OVER)
1,436,599,784✔
286
    SDB_GET_INT32(pRaw, dataPos, &pSchema->bytes, _OVER)
1,436,599,784✔
287
    SDB_GET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
1,436,599,784✔
288
    hasExtSchemas = hasExtSchemas || HAS_TYPE_MOD(pSchema);
1,436,599,784✔
289
  }
290

291
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
185,274,364✔
292
    SSchema *pSchema = &pStb->pTags[i];
169,263,338✔
293
    SDB_GET_INT8(pRaw, dataPos, &pSchema->type, _OVER)
169,263,338✔
294
    SDB_GET_INT8(pRaw, dataPos, &pSchema->flags, _OVER)
169,263,338✔
295
    SDB_GET_INT16(pRaw, dataPos, &pSchema->colId, _OVER)
169,263,338✔
296
    SDB_GET_INT32(pRaw, dataPos, &pSchema->bytes, _OVER)
169,263,338✔
297
    SDB_GET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
169,263,338✔
298
  }
299

300
  for (int32_t i = 0; i < pStb->numOfFuncs; ++i) {
16,011,026✔
301
    char funcName[TSDB_FUNC_NAME_LEN] = {0};
×
302
    SDB_GET_BINARY(pRaw, dataPos, funcName, TSDB_FUNC_NAME_LEN, _OVER)
×
303
    if (taosArrayPush(pStb->pFuncs, funcName) == NULL) goto _OVER;
×
304
  }
305

306
  if (pStb->commentLen > 0) {
16,011,026✔
307
    pStb->comment = taosMemoryCalloc(pStb->commentLen + 1, 1);
63,768✔
308
    if (pStb->comment == NULL) goto _OVER;
63,768✔
309
    SDB_GET_BINARY(pRaw, dataPos, pStb->comment, pStb->commentLen + 1, _OVER)
63,768✔
310
  }
311

312
  if (pStb->ast1Len > 0) {
16,011,026✔
313
    pStb->pAst1 = taosMemoryCalloc(pStb->ast1Len, 1);
×
314
    if (pStb->pAst1 == NULL) goto _OVER;
×
315
    SDB_GET_BINARY(pRaw, dataPos, pStb->pAst1, pStb->ast1Len, _OVER)
×
316
  }
317

318
  if (pStb->ast2Len > 0) {
16,011,026✔
319
    pStb->pAst2 = taosMemoryCalloc(pStb->ast2Len, 1);
×
320
    if (pStb->pAst2 == NULL) goto _OVER;
×
321
    SDB_GET_BINARY(pRaw, dataPos, pStb->pAst2, pStb->ast2Len, _OVER)
×
322
  }
323

324
  pStb->pCmpr = taosMemoryCalloc(pStb->numOfColumns, sizeof(SColCmpr));
16,011,026✔
325
  if (sver < STB_VER_SUPPORT_COMP) {
16,011,026✔
326
    // compatible with old data, setup default compress value
327
    // impl later
328
    for (int i = 0; i < pStb->numOfColumns; i++) {
×
329
      SSchema  *pSchema = &pStb->pColumns[i];
×
330
      SColCmpr *pCmpr = &pStb->pCmpr[i];
×
331
      pCmpr->id = pSchema->colId;
×
332
      pCmpr->alg = createDefaultColCmprByType(pSchema->type);
×
333
    }
334
  } else {
335
    for (int i = 0; i < pStb->numOfColumns; i++) {
1,452,610,810✔
336
      SColCmpr *pCmpr = &pStb->pCmpr[i];
1,436,599,784✔
337
      SDB_GET_INT16(pRaw, dataPos, &pCmpr->id, _OVER)
1,436,599,784✔
338
      SDB_GET_INT32(pRaw, dataPos, (int32_t *)&pCmpr->alg, _OVER)  // compatiable
1,436,599,784✔
339
    }
340
  }
341
  SDB_GET_INT64(pRaw, dataPos, &pStb->keep, _OVER)
16,011,026✔
342

343
  // type mod
344
  if (hasExtSchemas) {
16,011,026✔
345
    pStb->pExtSchemas = taosMemoryCalloc(pStb->numOfColumns, sizeof(SExtSchema));
7,366,079✔
346
    if (!pStb->pExtSchemas) goto _OVER;
7,366,079✔
347
    for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
1,164,937,665✔
348
      SSchema *pSchema = &pStb->pColumns[i];
1,157,571,586✔
349
      SDB_GET_INT32(pRaw, dataPos, &pStb->pExtSchemas[i].typeMod, _OVER)
1,157,571,586✔
350
    }
351
  }
352

353
  if (sver < STB_VER_SUPPORT_VIRTUAL) {
16,011,026✔
354
    pStb->virtualStb = 0;
×
355
  } else {
356
    SDB_GET_INT8(pRaw, dataPos, &pStb->virtualStb, _OVER)
16,011,026✔
357
  }
358

359
  if (sver < STB_VER_SUPPORT_OWNER) {
16,011,026✔
360
    pStb->createUser[0] = 0;
×
361
  } else {
362
    SDB_GET_BINARY(pRaw, dataPos, pStb->createUser, TSDB_USER_LEN, _OVER)
16,011,026✔
363
    SDB_GET_INT64(pRaw, dataPos, &pStb->ownerId, _OVER)
16,011,026✔
364
  }
365

366
  if (dataPos + sizeof(int8_t) <= pRaw->dataLen) {
16,011,026✔
367
    SDB_GET_INT8(pRaw, dataPos, &pStb->secureDelete, _OVER)
16,011,026✔
368
  } else {
369
    pStb->secureDelete = 0;
×
370
  }
371

372
  SDB_GET_RESERVE(pRaw, dataPos, STB_RESERVE_SIZE, _OVER)
16,011,026✔
373

374
  terrno = 0;
16,011,026✔
375

376
_OVER:
16,011,026✔
377
  if (terrno != 0) {
16,011,026✔
378
    mError("stb:%s, failed to decode from raw:%p since %s", pStb == NULL ? "null" : pStb->name, pRaw, terrstr());
×
379
    if (pStb != NULL) {
×
380
      taosMemoryFreeClear(pStb->pColumns);
×
381
      taosMemoryFreeClear(pStb->pTags);
×
382
      taosMemoryFreeClear(pStb->comment);
×
383
      taosMemoryFree(pStb->pCmpr);
×
384
      taosMemoryFreeClear(pStb->pExtSchemas);
×
385
    }
386
    taosMemoryFreeClear(pRow);
×
387
    return NULL;
×
388
  }
389

390
  mTrace("stb:%s, decode from raw:%p, row:%p", pStb->name, pRaw, pStb);
16,011,026✔
391
  return pRow;
16,011,026✔
392
}
393

394
void mndFreeStb(SStbObj *pStb) {
18,076,931✔
395
  taosArrayDestroy(pStb->pFuncs);
18,076,931✔
396
  taosMemoryFreeClear(pStb->pColumns);
18,076,931✔
397
  taosMemoryFreeClear(pStb->pTags);
18,076,931✔
398
  taosMemoryFreeClear(pStb->comment);
18,076,931✔
399
  taosMemoryFreeClear(pStb->pAst1);
18,076,931✔
400
  taosMemoryFreeClear(pStb->pAst2);
18,076,931✔
401
  taosMemoryFreeClear(pStb->pCmpr);
18,076,931✔
402
  taosMemoryFreeClear(pStb->pExtSchemas);
18,076,931✔
403
}
18,076,931✔
404

405
static int32_t mndStbActionInsert(SSdb *pSdb, SStbObj *pStb) {
2,569,399✔
406
  mTrace("stb:%s, perform insert action, row:%p", pStb->name, pStb);
2,569,399✔
407
  return 0;
2,569,399✔
408
}
409

410
static int32_t mndStbActionDelete(SSdb *pSdb, SStbObj *pStb) {
18,003,856✔
411
  mTrace("stb:%s, perform delete action, row:%p", pStb->name, pStb);
18,003,856✔
412
  mndFreeStb(pStb);
18,003,856✔
413
  return 0;
18,003,856✔
414
}
415

416
static int32_t mndStbActionUpdate(SSdb *pSdb, SStbObj *pOld, SStbObj *pNew) {
12,317,327✔
417
  terrno = 0;
12,317,327✔
418
  mTrace("stb:%s, perform update action, old row:%p new row:%p", pOld->name, pOld, pNew);
12,317,327✔
419

420
  taosWLockLatch(&pOld->lock);
12,317,327✔
421
  int32_t numOfColumns = pOld->numOfColumns;
12,317,327✔
422
  if (pOld->numOfColumns < pNew->numOfColumns) {
12,317,327✔
423
    void *pColumns = taosMemoryMalloc(pNew->numOfColumns * sizeof(SSchema));
2,724,929✔
424
    if (pColumns == NULL) {
2,724,929✔
425
      goto END;
×
426
    }
427
    taosMemoryFree(pOld->pColumns);
2,724,929✔
428
    pOld->pColumns = pColumns;
2,724,929✔
429
  }
430

431
  if (pOld->numOfTags < pNew->numOfTags) {
12,317,327✔
432
    void *pTags = taosMemoryMalloc(pNew->numOfTags * sizeof(SSchema));
298,818✔
433
    if (pTags == NULL) {
298,818✔
434
      goto END;
×
435
    }
436
    taosMemoryFree(pOld->pTags);
298,818✔
437
    pOld->pTags = pTags;
298,818✔
438
  }
439

440
  if (pOld->commentLen < pNew->commentLen && pNew->commentLen > 0) {
12,317,327✔
441
    void *comment = taosMemoryMalloc(pNew->commentLen + 1);
6,255✔
442
    if (comment == NULL) {
6,255✔
443
      goto END;
×
444
    }
445
    taosMemoryFree(pOld->comment);
6,255✔
446
    pOld->comment = comment;
6,255✔
447
  }
448
  pOld->commentLen = pNew->commentLen;
12,317,327✔
449

450
  if (pOld->ast1Len < pNew->ast1Len) {
12,317,327✔
451
    void *pAst1 = taosMemoryMalloc(pNew->ast1Len + 1);
×
452
    if (pAst1 == NULL) {
×
453
      goto END;
×
454
    }
455
    taosMemoryFree(pOld->pAst1);
×
456
    pOld->pAst1 = pAst1;
×
457
  }
458

459
  if (pOld->ast2Len < pNew->ast2Len) {
12,317,327✔
460
    void *pAst2 = taosMemoryMalloc(pNew->ast2Len + 1);
×
461
    if (pAst2 == NULL) {
×
462
      goto END;
×
463
    }
464
    taosMemoryFree(pOld->pAst2);
×
465
    pOld->pAst2 = pAst2;
×
466
  }
467

468
  pOld->updateTime = pNew->updateTime;
12,317,327✔
469
  pOld->tagVer = pNew->tagVer;
12,317,327✔
470
  pOld->colVer = pNew->colVer;
12,317,327✔
471
  pOld->smaVer = pNew->smaVer;
12,317,327✔
472
  pOld->nextColId = pNew->nextColId;
12,317,327✔
473
  pOld->ttl = pNew->ttl;
12,317,327✔
474
  pOld->keep = pNew->keep;
12,317,327✔
475
  pOld->ownerId = pNew->ownerId;
12,317,327✔
476
  pOld->secureDelete = pNew->secureDelete;
12,317,327✔
477

478
  if (pNew->numOfColumns > 0) {
12,317,327✔
479
    pOld->numOfColumns = pNew->numOfColumns;
12,317,327✔
480
    memcpy(pOld->pColumns, pNew->pColumns, pOld->numOfColumns * sizeof(SSchema));
12,317,327✔
481
  }
482
  if (pNew->numOfTags > 0) {
12,317,327✔
483
    pOld->numOfTags = pNew->numOfTags;
12,317,327✔
484
    memcpy(pOld->pTags, pNew->pTags, pOld->numOfTags * sizeof(SSchema));
12,317,327✔
485
  }
486
  if (pNew->commentLen > 0) {
12,317,327✔
487
    memcpy(pOld->comment, pNew->comment, pNew->commentLen + 1);
41,910✔
488
    pOld->commentLen = pNew->commentLen;
41,910✔
489
  }
490
  if (pNew->ast1Len != 0) {
12,317,327✔
491
    memcpy(pOld->pAst1, pNew->pAst1, pNew->ast1Len);
×
492
    pOld->ast1Len = pNew->ast1Len;
×
493
  }
494
  if (pNew->ast2Len != 0) {
12,317,327✔
495
    memcpy(pOld->pAst2, pNew->pAst2, pNew->ast2Len);
×
496
    pOld->ast2Len = pNew->ast2Len;
×
497
  }
498
  if (numOfColumns < pNew->numOfColumns) {
12,317,327✔
499
    taosMemoryFree(pOld->pCmpr);
2,724,929✔
500
    pOld->pCmpr = taosMemoryCalloc(pNew->numOfColumns, sizeof(SColCmpr));
2,724,929✔
501
    if (pOld->pCmpr == NULL){
2,724,929✔
502
      goto END;
×
503
    }
504
    memcpy(pOld->pCmpr, pNew->pCmpr, pNew->numOfColumns * sizeof(SColCmpr));
2,724,929✔
505
  } else {
506
    memcpy(pOld->pCmpr, pNew->pCmpr, pNew->numOfColumns * sizeof(SColCmpr));
9,592,398✔
507
  }
508

509
  if (pNew->pExtSchemas) {
12,317,327✔
510
    taosMemoryFreeClear(pOld->pExtSchemas);
7,298,567✔
511
    pOld->pExtSchemas = taosMemoryCalloc(pNew->numOfColumns, sizeof(SExtSchema));
7,298,567✔
512
    if (pOld->pExtSchemas == NULL){
7,298,567✔
513
      goto END;
×
514
    }
515
    memcpy(pOld->pExtSchemas, pNew->pExtSchemas, pNew->numOfColumns * sizeof(SExtSchema));
7,298,567✔
516
  }
517

518
END:
5,018,760✔
519
  taosWUnLockLatch(&pOld->lock);
12,317,327✔
520
  return terrno;
12,317,327✔
521
}
522

523
SStbObj *mndAcquireStb(SMnode *pMnode, char *stbName) {
37,429,538✔
524
  SSdb    *pSdb = pMnode->pSdb;
37,429,538✔
525
  SStbObj *pStb = sdbAcquire(pSdb, SDB_STB, stbName);
37,429,538✔
526
  if (pStb == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
37,429,538✔
527
    terrno = TSDB_CODE_MND_STB_NOT_EXIST;
3,300,041✔
528
  }
529
  return pStb;
37,429,538✔
530
}
531

532
void mndReleaseStb(SMnode *pMnode, SStbObj *pStb) {
36,663,705✔
533
  SSdb *pSdb = pMnode->pSdb;
36,663,705✔
534
  sdbRelease(pSdb, pStb);
36,663,705✔
535
}
36,663,705✔
536

537
SDbObj *mndAcquireDbByStb(SMnode *pMnode, const char *stbName) {
8,584,267✔
538
  SName name = {0};
8,584,267✔
539
  if ((terrno = tNameFromString(&name, stbName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0) return NULL;
8,584,267✔
540

541
  char db[TSDB_TABLE_FNAME_LEN] = {0};
8,584,267✔
542
  if ((terrno = tNameGetFullDbName(&name, db)) != 0) return NULL;
8,584,267✔
543

544
  return mndAcquireDb(pMnode, db);
8,584,267✔
545
}
546

547
static FORCE_INLINE int32_t schemaExColIdCompare(const void *colId, const void *pSchema) {
548
  if (*(col_id_t *)colId < ((SSchema *)pSchema)->colId) {
549
    return -1;
550
  } else if (*(col_id_t *)colId > ((SSchema *)pSchema)->colId) {
551
    return 1;
552
  }
553
  return 0;
554
}
555

556
void *mndBuildVCreateStbReq(SMnode *pMnode, SVgObj *pVgroup, SStbObj *pStb, int32_t *pContLen, void *alterOriData,
11,537,774✔
557
                            int32_t alterOriDataLen) {
558
  SEncoder       encoder = {0};
11,537,774✔
559
  int32_t        contLen;
560
  SName          name = {0};
11,537,774✔
561
  SVCreateStbReq req = {0};
11,537,774✔
562

563
  if ((terrno = tNameFromString(&name, pStb->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0) {
11,537,774✔
564
    goto _err;
×
565
  }
566
  char dbFName[TSDB_DB_FNAME_LEN] = {0};
11,537,774✔
567
  if ((terrno = tNameGetFullDbName(&name, dbFName)) != 0) {
11,537,774✔
568
    goto _err;
×
569
  };
570

571
  req.name = (char *)tNameGetTableName(&name);
11,537,774✔
572
  req.suid = pStb->uid;
11,537,774✔
573
  req.rollup = pStb->ast1Len > 0 ? 1 : 0;
11,537,774✔
574
  req.alterOriData = alterOriData;
11,537,774✔
575
  req.alterOriDataLen = alterOriDataLen;
11,537,774✔
576
  req.source = pStb->source;
11,537,774✔
577
  req.virtualStb = pStb->virtualStb;
11,537,774✔
578
  req.secureDelete = pStb->secureDelete;
11,537,774✔
579
  // todo
580
  req.schemaRow.nCols = pStb->numOfColumns;
11,537,774✔
581
  req.schemaRow.version = pStb->colVer;
11,537,774✔
582
  req.schemaRow.pSchema = pStb->pColumns;
11,537,774✔
583
  req.schemaTag.nCols = pStb->numOfTags;
11,537,774✔
584
  req.schemaTag.version = pStb->tagVer;
11,537,774✔
585
  req.schemaTag.pSchema = pStb->pTags;
11,537,774✔
586

587
  req.colCmpred = 1;
11,537,774✔
588
  SColCmprWrapper *pCmpr = &req.colCmpr;
11,537,774✔
589
  req.keep = pStb->keep;
11,537,774✔
590
  pCmpr->version = pStb->colVer;
11,537,774✔
591
  pCmpr->nCols = pStb->numOfColumns;
11,537,774✔
592

593
  req.colCmpr.pColCmpr = taosMemoryCalloc(pCmpr->nCols, sizeof(SColCmpr));
11,537,774✔
594
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
904,165,921✔
595
    SColCmpr *p = &pCmpr->pColCmpr[i];
892,628,147✔
596
    p->alg = pStb->pCmpr[i].alg;
892,628,147✔
597
    p->id = pStb->pCmpr[i].id;
892,628,147✔
598
  }
599

600
  req.pExtSchemas = pStb->pExtSchemas; // only reference to it.
11,537,774✔
601
  // get length
602
  int32_t ret = 0;
11,537,774✔
603
  tEncodeSize(tEncodeSVCreateStbReq, &req, contLen, ret);
11,537,774✔
604
  if (ret < 0) {
11,537,774✔
605
    goto _err;
×
606
  }
607

608
  contLen += sizeof(SMsgHead);
11,537,774✔
609

610
  SMsgHead *pHead = taosMemoryCalloc(1, contLen);
11,537,774✔
611
  if (pHead == NULL) {
11,537,774✔
612
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
613
    goto _err;
×
614
  }
615

616
  pHead->contLen = htonl(contLen);
11,537,774✔
617
  pHead->vgId = htonl(pVgroup->vgId);
11,537,774✔
618

619
  void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
11,537,774✔
620
  tEncoderInit(&encoder, pBuf, contLen - sizeof(SMsgHead));
11,537,774✔
621
  if (tEncodeSVCreateStbReq(&encoder, &req) < 0) {
11,537,774✔
622
    taosMemoryFreeClear(pHead);
×
623
    tEncoderClear(&encoder);
×
624
    goto _err;
×
625
  }
626
  tEncoderClear(&encoder);
11,537,774✔
627

628
  *pContLen = contLen;
11,537,774✔
629
  taosMemoryFreeClear(req.rsmaParam.name);
11,537,774✔
630
  taosMemoryFreeClear(req.rsmaParam.funcColIds);
11,537,774✔
631
  taosMemoryFreeClear(req.rsmaParam.funcIds);
11,537,774✔
632
  taosMemoryFreeClear(req.colCmpr.pColCmpr);
11,537,774✔
633
  return pHead;
11,537,774✔
634
_err:
×
635
  taosMemoryFreeClear(req.rsmaParam.name);
×
636
  taosMemoryFreeClear(req.rsmaParam.funcColIds);
×
637
  taosMemoryFreeClear(req.rsmaParam.funcIds);
×
638
  taosMemoryFreeClear(req.colCmpr.pColCmpr);
×
639
  return NULL;
×
640
}
641

642
static void *mndBuildVDropStbReq(SMnode *pMnode, SVgObj *pVgroup, SStbObj *pStb, int32_t *pContLen) {
5,516,414✔
643
  SName        name = {0};
5,516,414✔
644
  SVDropStbReq req = {0};
5,516,414✔
645
  int32_t      contLen = 0;
5,516,414✔
646
  int32_t      ret = 0;
5,516,414✔
647
  SMsgHead    *pHead = NULL;
5,516,414✔
648
  SEncoder     encoder = {0};
5,516,414✔
649

650
  if ((terrno = tNameFromString(&name, pStb->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0) {
5,516,414✔
651
    return NULL;
×
652
  }
653

654
  req.name = (char *)tNameGetTableName(&name);
5,516,414✔
655
  req.suid = pStb->uid;
5,516,414✔
656

657
  tEncodeSize(tEncodeSVDropStbReq, &req, contLen, ret);
5,516,414✔
658
  if (ret < 0) return NULL;
5,516,414✔
659

660
  contLen += sizeof(SMsgHead);
5,516,414✔
661
  pHead = taosMemoryMalloc(contLen);
5,516,414✔
662
  if (pHead == NULL) {
5,516,414✔
663
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
664
    return NULL;
×
665
  }
666

667
  pHead->contLen = htonl(contLen);
5,516,414✔
668
  pHead->vgId = htonl(pVgroup->vgId);
5,516,414✔
669

670
  void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
5,516,414✔
671

672
  tEncoderInit(&encoder, pBuf, contLen - sizeof(SMsgHead));
5,516,414✔
673
  int32_t code = tEncodeSVDropStbReq(&encoder, &req);
5,516,414✔
674
  tEncoderClear(&encoder);
5,516,414✔
675
  if (code != 0) {
5,516,414✔
676
    terrno = code;
×
677
    return NULL;
×
678
  }
679

680
  *pContLen = contLen;
5,516,414✔
681
  return pHead;
5,516,414✔
682
}
683

684
int32_t mndCheckCreateStbReq(SMCreateStbReq *pCreate) {
2,120,303✔
685
  int32_t code = 0;
2,120,303✔
686
  if (pCreate->igExists < 0 || pCreate->igExists > 1) {
2,120,303✔
687
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
688
    TAOS_RETURN(code);
×
689
  }
690

691
  if (pCreate->virtualStb != 0 && pCreate->virtualStb != 1) {
2,120,303✔
692
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
693
    TAOS_RETURN(code);
×
694
  }
695

696
  int32_t maxColumns = pCreate->virtualStb ? TSDB_MAX_COLUMNS : TSDB_MAX_COLUMNS_NON_VIRTUAL;
2,120,303✔
697
  if (pCreate->numOfColumns < TSDB_MIN_COLUMNS || pCreate->numOfTags + pCreate->numOfColumns > maxColumns) {
2,120,303✔
698
    code = TSDB_CODE_PAR_INVALID_COLUMNS_NUM;
×
699
    TAOS_RETURN(code);
×
700
  }
701

702
  if (pCreate->numOfTags <= 0 || pCreate->numOfTags > TSDB_MAX_TAGS) {
2,120,303✔
703
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
704
    TAOS_RETURN(code);
×
705
  }
706

707
  SField *pField = taosArrayGet(pCreate->pColumns, 0);
2,120,303✔
708
  if (pField->type != TSDB_DATA_TYPE_TIMESTAMP) {
2,120,303✔
709
    code = TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
710
    TAOS_RETURN(code);
×
711
  }
712

713
  for (int32_t i = 0; i < pCreate->numOfColumns; ++i) {
165,121,821✔
714
    SFieldWithOptions *pField1 = taosArrayGet(pCreate->pColumns, i);
163,001,518✔
715
    if (pField1->type >= TSDB_DATA_TYPE_MAX) {
163,001,518✔
716
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
717
      TAOS_RETURN(code);
×
718
    }
719
    if (pField1->bytes <= 0) {
163,001,518✔
720
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
721
      TAOS_RETURN(code);
×
722
    }
723
    if (pField1->name[0] == 0) {
163,001,518✔
724
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
725
      TAOS_RETURN(code);
×
726
    }
727
  }
728

729
  for (int32_t i = 0; i < pCreate->numOfTags; ++i) {
10,806,281✔
730
    SField *pField1 = taosArrayGet(pCreate->pTags, i);
8,685,978✔
731
    if (pField1->type >= TSDB_DATA_TYPE_MAX) {
8,685,978✔
732
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
733
      TAOS_RETURN(code);
×
734
    }
735
    if (pField1->bytes <= 0) {
8,685,978✔
736
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
737
      TAOS_RETURN(code);
×
738
    }
739
    if (pField1->name[0] == 0) {
8,685,978✔
740
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
741
      TAOS_RETURN(code);
×
742
    }
743
  }
744

745
  TAOS_RETURN(code);
2,120,303✔
746
}
747

748
static int32_t mndSetCreateStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
×
749
  int32_t  code = 0;
×
750
  SSdbRaw *pRedoRaw = mndStbActionEncode(pStb);
×
751
  if (pRedoRaw == NULL) {
×
752
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
753
    if (terrno != 0) code = terrno;
×
754
    TAOS_RETURN(code);
×
755
  }
756
  if ((code = mndTransAppendPrepareLog(pTrans, pRedoRaw)) != 0) {
×
757
    sdbFreeRaw(pRedoRaw);
×
758
    TAOS_RETURN(code);
×
759
  }
760
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_CREATING));
×
761

762
  TAOS_RETURN(code);
×
763
}
764

765
int32_t mndSetCreateStbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
2,058,832✔
766
  int32_t  code = 0;
2,058,832✔
767
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
2,058,832✔
768
  if (pCommitRaw == NULL) {
2,058,832✔
769
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
770
    if (terrno != 0) code = terrno;
×
771
    TAOS_RETURN(code);
×
772
  }
773
  mInfo("trans:%d, add stb to commit log", pTrans->id);
2,058,832✔
774
  if ((code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
2,058,832✔
775
    sdbFreeRaw(pCommitRaw);
×
776
    TAOS_RETURN(code);
×
777
  }
778
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
2,058,832✔
779

780
  TAOS_RETURN(code);
2,058,832✔
781
}
782

783
static int32_t mndSetCreateStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
2,056,902✔
784
  int32_t code = 0;
2,056,902✔
785
  SSdb   *pSdb = pMnode->pSdb;
2,056,902✔
786
  SVgObj *pVgroup = NULL;
2,056,902✔
787
  void   *pIter = NULL;
2,056,902✔
788
  int32_t contLen;
2,053,381✔
789

790
  while (1) {
9,140,008✔
791
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
11,196,910✔
792
    if (pIter == NULL) break;
11,196,910✔
793
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
9,140,008✔
794
      sdbRelease(pSdb, pVgroup);
4,587,643✔
795
      continue;
4,587,643✔
796
    }
797

798
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, NULL, 0);
4,552,365✔
799
    if (pReq == NULL) {
4,552,365✔
800
      sdbCancelFetch(pSdb, pIter);
×
801
      sdbRelease(pSdb, pVgroup);
×
802
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
803
      if (terrno != 0) code = terrno;
×
804
      TAOS_RETURN(code);
×
805
    }
806

807
    STransAction action = {0};
4,552,365✔
808
    action.mTraceId = pTrans->mTraceId;
4,552,365✔
809
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
4,552,365✔
810
    action.pCont = pReq;
4,552,365✔
811
    action.contLen = contLen;
4,552,365✔
812
    action.msgType = TDMT_VND_CREATE_STB;
4,552,365✔
813
    action.acceptableCode = TSDB_CODE_TDB_STB_ALREADY_EXIST;
4,552,365✔
814
    action.retryCode = TSDB_CODE_TDB_STB_NOT_EXIST;
4,552,365✔
815
    mInfo("trans:%d, add create stb to redo action", pTrans->id);
4,552,365✔
816
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
4,552,365✔
817
      taosMemoryFree(pReq);
×
818
      sdbCancelFetch(pSdb, pIter);
×
819
      sdbRelease(pSdb, pVgroup);
×
820
      TAOS_RETURN(code);
×
821
    }
822
    sdbRelease(pSdb, pVgroup);
4,552,365✔
823
  }
824

825
  TAOS_RETURN(code);
2,056,902✔
826
}
827

828
int32_t mndSetForceDropCreateStbRedoActions(SMnode *pMnode, STrans *pTrans, SVgObj *pVgroup, SStbObj *pStb) {
×
829
  int32_t code = 0;
×
830
  SSdb   *pSdb = pMnode->pSdb;
×
831
  int32_t contLen;
×
832

833
  void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, NULL, 0);
×
834
  if (pReq == NULL) {
×
835
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
836
    if (terrno != 0) code = terrno;
×
837
    TAOS_RETURN(code);
×
838
  }
839

840
  STransAction action = {0};
×
841
  action.mTraceId = pTrans->mTraceId;
×
842
  action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
×
843
  action.pCont = pReq;
×
844
  action.contLen = contLen;
×
845
  action.msgType = TDMT_VND_CREATE_STB;
×
846
  action.acceptableCode = TSDB_CODE_TDB_STB_ALREADY_EXIST;
×
847
  action.retryCode = TSDB_CODE_TDB_STB_NOT_EXIST;
×
848
  action.groupId = pVgroup->vgId;
×
849
  if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
×
850
    taosMemoryFree(pReq);
×
851
    TAOS_RETURN(code);
×
852
  }
853

854
  TAOS_RETURN(code);
×
855
}
856

857
static int32_t mndSetCreateStbUndoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
2,056,902✔
858
  int32_t code = 0;
2,056,902✔
859
  SSdb   *pSdb = pMnode->pSdb;
2,056,902✔
860
  SVgObj *pVgroup = NULL;
2,056,902✔
861
  void   *pIter = NULL;
2,056,902✔
862

863
  while (1) {
9,140,008✔
864
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
11,196,910✔
865
    if (pIter == NULL) break;
11,196,910✔
866
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
9,140,008✔
867
      sdbRelease(pSdb, pVgroup);
4,587,643✔
868
      continue;
4,587,643✔
869
    }
870

871
    int32_t contLen = 0;
4,552,365✔
872
    void   *pReq = mndBuildVDropStbReq(pMnode, pVgroup, pStb, &contLen);
4,552,365✔
873
    if (pReq == NULL) {
4,552,365✔
874
      sdbCancelFetch(pSdb, pIter);
×
875
      sdbRelease(pSdb, pVgroup);
×
876
      code = TSDB_CODE_OUT_OF_MEMORY;
×
877
      TAOS_RETURN(code);
×
878
    }
879

880
    STransAction action = {0};
4,552,365✔
881
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
4,552,365✔
882
    action.pCont = pReq;
4,552,365✔
883
    action.contLen = contLen;
4,552,365✔
884
    action.msgType = TDMT_VND_DROP_STB;
4,552,365✔
885
    action.acceptableCode = TSDB_CODE_TDB_STB_NOT_EXIST;
4,552,365✔
886
    mInfo("trans:%d, add drop stb to undo action", pTrans->id);
4,552,365✔
887
    if ((code = mndTransAppendUndoAction(pTrans, &action)) != 0) {
4,552,365✔
888
      taosMemoryFree(pReq);
×
889
      sdbCancelFetch(pSdb, pIter);
×
890
      sdbRelease(pSdb, pVgroup);
×
891
      TAOS_RETURN(code);
×
892
    }
893
    sdbRelease(pSdb, pVgroup);
4,552,365✔
894
  }
895

896
  TAOS_RETURN(code);
2,056,902✔
897
}
898

899
static SSchema *mndFindStbColumns(const SStbObj *pStb, const char *colName) {
×
900
  for (int32_t col = 0; col < pStb->numOfColumns; ++col) {
×
901
    SSchema *pSchema = &pStb->pColumns[col];
×
902
    if (taosStrncasecmp(pSchema->name, colName, TSDB_COL_NAME_LEN) == 0) {
×
903
      return pSchema;
×
904
    }
905
  }
906
  return NULL;
×
907
}
908

909
int32_t mndBuildStbFromReq(SMnode *pMnode, SStbObj *pDst, SMCreateStbReq *pCreate, SDbObj *pDb) {
2,063,975✔
910
  int32_t code = 0;
2,063,975✔
911
  bool    hasTypeMods = false;
2,063,975✔
912
  memcpy(pDst->name, pCreate->name, TSDB_TABLE_FNAME_LEN);
2,063,975✔
913
  memcpy(pDst->db, pDb->name, TSDB_DB_FNAME_LEN);
2,063,975✔
914
  pDst->createdTime = taosGetTimestampMs();
2,063,975✔
915
  pDst->updateTime = pDst->createdTime;
2,063,975✔
916
  pDst->uid = (pCreate->source == TD_REQ_FROM_TAOX_OLD || pCreate->source == TD_REQ_FROM_TAOX || pCreate->source == TD_REQ_FROM_SML)
6,184,883✔
917
                  ? pCreate->suid
918
                  : mndGenerateUid(pCreate->name, TSDB_TABLE_FNAME_LEN);
4,127,950✔
919
  pDst->dbUid = pDb->uid;
2,063,975✔
920
  pDst->tagVer = 1;
2,063,975✔
921
  pDst->colVer = 1;
2,063,975✔
922
  pDst->smaVer = 1;
2,063,975✔
923
  pDst->nextColId = 1;
2,063,975✔
924
  pDst->maxdelay[0] = pCreate->delay1;
2,063,975✔
925
  pDst->maxdelay[1] = pCreate->delay2;
2,063,975✔
926
  pDst->watermark[0] = pCreate->watermark1;
2,063,975✔
927
  pDst->watermark[1] = pCreate->watermark2;
2,063,975✔
928
  pDst->ttl = pCreate->ttl;
2,063,975✔
929
  pDst->numOfColumns = pCreate->numOfColumns;
2,063,975✔
930
  pDst->numOfTags = pCreate->numOfTags;
2,063,975✔
931
  pDst->numOfFuncs = pCreate->numOfFuncs;
2,063,975✔
932
  pDst->commentLen = pCreate->commentLen;
2,063,975✔
933
  pDst->pFuncs = pCreate->pFuncs;
2,063,975✔
934
  pDst->source = pCreate->source;
2,063,975✔
935
  pDst->keep = pCreate->keep;
2,063,975✔
936
  pDst->virtualStb = pCreate->virtualStb;
2,063,975✔
937
  pDst->secureDelete = pCreate->secureDelete;
2,063,975✔
938
  pCreate->pFuncs = NULL;
2,063,975✔
939

940
  if (pDst->commentLen > 0) {
2,063,975✔
941
    pDst->comment = taosMemoryCalloc(pDst->commentLen + 1, 1);
9,260✔
942
    if (pDst->comment == NULL) {
9,260✔
943
      code = terrno;
×
944
      TAOS_RETURN(code);
×
945
    }
946
    memcpy(pDst->comment, pCreate->pComment, pDst->commentLen + 1);
9,260✔
947
  }
948

949
  pDst->ast1Len = pCreate->ast1Len;
2,063,975✔
950
  if (pDst->ast1Len > 0) {
2,063,975✔
951
    pDst->pAst1 = taosMemoryCalloc(pDst->ast1Len, 1);
×
952
    if (pDst->pAst1 == NULL) {
×
953
      code = terrno;
×
954
      TAOS_RETURN(code);
×
955
    }
956
    memcpy(pDst->pAst1, pCreate->pAst1, pDst->ast1Len);
×
957
  }
958

959
  pDst->ast2Len = pCreate->ast2Len;
2,063,975✔
960
  if (pDst->ast2Len > 0) {
2,063,975✔
961
    pDst->pAst2 = taosMemoryCalloc(pDst->ast2Len, 1);
×
962
    if (pDst->pAst2 == NULL) {
×
963
      code = terrno;
×
964
      TAOS_RETURN(code);
×
965
    }
966
    memcpy(pDst->pAst2, pCreate->pAst2, pDst->ast2Len);
×
967
  }
968

969
  pDst->pColumns = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SSchema));
2,063,975✔
970
  pDst->pTags = taosMemoryCalloc(1, pDst->numOfTags * sizeof(SSchema));
2,063,975✔
971
  if (pDst->pColumns == NULL || pDst->pTags == NULL) {
2,063,975✔
972
    code = terrno;
×
973
    TAOS_RETURN(code);
×
974
  }
975

976
  if (pDst->nextColId < 0 || pDst->nextColId >= 0x7fff - pDst->numOfColumns - pDst->numOfTags) {
2,063,975✔
977
    code = TSDB_CODE_OUT_OF_RANGE;
1,178✔
978
    TAOS_RETURN(code);
1,178✔
979
  }
980

981
  for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
126,142,492✔
982
    SFieldWithOptions *pField = taosArrayGet(pCreate->pColumns, i);
124,079,695✔
983
    SSchema           *pSchema = &pDst->pColumns[i];
124,079,695✔
984
    pSchema->type = pField->type;
124,079,695✔
985
    pSchema->bytes = pField->bytes;
124,079,695✔
986
    pSchema->flags = pField->flags;
124,079,695✔
987
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
124,079,695✔
988
    pSchema->colId = pDst->nextColId;
124,079,695✔
989
    pDst->nextColId++;
124,079,695✔
990
    hasTypeMods = hasTypeMods || HAS_TYPE_MOD(pSchema);
124,079,695✔
991
  }
992

993
  for (int32_t i = 0; i < pDst->numOfTags; ++i) {
10,484,779✔
994
    SField  *pField = taosArrayGet(pCreate->pTags, i);
8,421,982✔
995
    SSchema *pSchema = &pDst->pTags[i];
8,421,982✔
996
    pSchema->type = pField->type;
8,421,982✔
997
    pSchema->bytes = pField->bytes;
8,421,982✔
998
    if (i == 0) {
8,421,982✔
999
      SSCHMEA_SET_IDX_ON(pSchema);
2,062,797✔
1000
    }
1001
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
8,421,982✔
1002
    pSchema->colId = pDst->nextColId;
8,421,982✔
1003
    pDst->nextColId++;
8,421,982✔
1004
  }
1005
  // set col compress
1006
  pDst->pCmpr = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SCmprObj));
2,062,797✔
1007
  for (int32_t i = 0; i < pDst->numOfColumns; i++) {
126,142,492✔
1008
    SFieldWithOptions *pField = taosArrayGet(pCreate->pColumns, i);
124,079,695✔
1009
    SSchema           *pSchema = &pDst->pColumns[i];
124,079,695✔
1010

1011
    SColCmpr *pColCmpr = &pDst->pCmpr[i];
124,079,695✔
1012
    pColCmpr->id = pSchema->colId;
124,079,695✔
1013
    pColCmpr->alg = pField->compress;
124,079,695✔
1014
  }
1015

1016
  if (hasTypeMods) {
2,062,797✔
1017
    pDst->pExtSchemas = taosMemoryCalloc(pDst->numOfColumns, sizeof(SExtSchema));
28,920✔
1018
    if (!pDst->pExtSchemas) {
28,920✔
1019
      code = terrno;
×
1020
      TAOS_RETURN(code);
×
1021
    }
1022
    for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
385,341✔
1023
      SFieldWithOptions * pField = taosArrayGet(pCreate->pColumns, i);
356,421✔
1024
      pDst->pExtSchemas[i].typeMod = pField->typeMod;
356,421✔
1025
    }
1026
  }
1027
  TAOS_RETURN(code);
2,062,797✔
1028
}
1029
int32_t mndGenIdxNameForFirstTag(char *fullname, char *dbname, char *stbname, char *tagname) {
1,993,338✔
1030
  SName name = {0};
1,993,338✔
1031
  if ((terrno = tNameFromString(&name, stbname, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0) {
1,993,338✔
1032
    return -1;
×
1033
  }
1034
  return snprintf(fullname, TSDB_INDEX_FNAME_LEN, "%s.%s_%s", dbname, tagname, tNameGetTableName(&name));
1,993,338✔
1035
}
1036

1037
static int32_t mndCreateStb(SMnode *pMnode, SRpcMsg *pReq, SMCreateStbReq *pCreate, SDbObj *pDb, SUserObj *pOperUser) {
1,992,586✔
1038
  SStbObj stbObj = {0};
1,992,586✔
1039
  int32_t code = -1;
1,992,586✔
1040

1041
  char fullIdxName[TSDB_INDEX_FNAME_LEN * 2] = {0};
1,992,586✔
1042

1043
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_DB_INSIDE, pReq, "create-stb");
1,992,586✔
1044
  if (pTrans == NULL) {
1,992,586✔
1045
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1046
    if (terrno != 0) code = terrno;
×
1047
    goto _OVER;
×
1048
  }
1049

1050
  mInfo("trans:%d, used to create stb:%s", pTrans->id, pCreate->name);
1,992,586✔
1051
  TAOS_CHECK_GOTO(mndBuildStbFromReq(pMnode, &stbObj, pCreate, pDb), NULL, _OVER);
1,992,586✔
1052
  memcpy(stbObj.createUser, pOperUser->name, TSDB_USER_LEN);
1,991,408✔
1053
  stbObj.ownerId = pOperUser->uid;
1,991,408✔
1054

1055

1056
  SSchema *pSchema = &(stbObj.pTags[0]);
1,991,408✔
1057
  if (mndGenIdxNameForFirstTag(fullIdxName, pDb->name, stbObj.name, pSchema->name) < 0) {
1,991,408✔
1058
    code = terrno;
×
1059
    goto _OVER;
×
1060
  }
1061
  SSIdx idx = {0};
1,991,408✔
1062
  if (mndAcquireGlobalIdx(pMnode, fullIdxName, SDB_IDX, &idx) == 0 && idx.pIdx != NULL) {
1,991,408✔
1063
    code = TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST;
×
1064
    mndReleaseIdx(pMnode, idx.pIdx);
×
1065
    goto _OVER;
×
1066
  }
1067

1068
  SIdxObj idxObj = {0};
1,991,408✔
1069
  memcpy(idxObj.name, fullIdxName, TSDB_INDEX_FNAME_LEN);
1,991,408✔
1070
  memcpy(idxObj.stb, stbObj.name, TSDB_TABLE_FNAME_LEN);
1,991,408✔
1071
  memcpy(idxObj.db, stbObj.db, TSDB_DB_FNAME_LEN);
1,991,408✔
1072
  memcpy(idxObj.colName, pSchema->name, TSDB_COL_NAME_LEN);
1,991,408✔
1073
  memcpy(idxObj.createUser, pOperUser->name, TSDB_USER_LEN);
1,991,408✔
1074
  idxObj.ownerId = pOperUser->uid;
1,991,408✔
1075
  idxObj.createdTime = taosGetTimestampMs();
1,991,408✔
1076
  idxObj.uid = mndGenerateUid(fullIdxName, strlen(fullIdxName));
1,991,408✔
1077
  idxObj.stbUid = stbObj.uid;
1,991,408✔
1078
  idxObj.dbUid = stbObj.dbUid;
1,991,408✔
1079

1080
  TAOS_CHECK_GOTO(mndSetCreateIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
1,991,408✔
1081

1082
  TAOS_CHECK_GOTO(mndAddStbToTrans(pMnode, pTrans, pDb, &stbObj), NULL, _OVER);
1,991,408✔
1083
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
1,985,513✔
1084
  code = 0;
1,985,513✔
1085

1086
_OVER:
1,992,586✔
1087
  mndTransDrop(pTrans);
1,992,586✔
1088
  if (mndStbActionDelete(pMnode->pSdb, &stbObj) != 0) mError("failed to mndStbActionDelete");
1,992,586✔
1089
  TAOS_RETURN(code);
1,992,586✔
1090
}
1091

1092
typedef struct {
1093
  const char *name;
1094
  uint8_t     type;
1095
  int32_t     bytes;
1096
  uint32_t    alg;
1097
} AuditColumnDef;
1098

1099
// column is consistent with vnodePrepareRow process in vnodeSvr.c
1100
static const AuditColumnDef audit_columns[] = {
1101
    {"ts", TSDB_DATA_TYPE_TIMESTAMP, 8, 0x2000102},
1102
    {"details", TSDB_DATA_TYPE_VARCHAR, 50000 + VARSTR_HEADER_SIZE, 0xFF000302},
1103
    {"user_name", TSDB_DATA_TYPE_VARCHAR, 25 + VARSTR_HEADER_SIZE, 0xFF000302},
1104
    {"operation", TSDB_DATA_TYPE_VARCHAR, 20 + VARSTR_HEADER_SIZE, 0xFF000302},
1105
    {"db", TSDB_DATA_TYPE_VARCHAR, TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE, 0xFF000302},
1106
    {"resource", TSDB_DATA_TYPE_VARCHAR, TSDB_STREAM_NAME_LEN + VARSTR_HEADER_SIZE, 0xFF000302},
1107
    {"client_address", TSDB_DATA_TYPE_VARCHAR, AUDIT_CLIENT_ADD_LEN + VARSTR_HEADER_SIZE, 0xFF000302},
1108
    {"duration", TSDB_DATA_TYPE_DOUBLE, 8, 0x5000102},
1109
    {"affected_rows", TSDB_DATA_TYPE_UBIGINT, 8, 0x1000102}};
1110

1111
static int32_t mndBuildAuditStb(SMnode *pMnode, SStbObj *pDst, SDbObj *pDb) {
244✔
1112
  int32_t code = 0;
244✔
1113
  char   *name = AUDIT_STABLE_NAME;
244✔
1114
  (void)tsnprintf(pDst->name, TSDB_TABLE_FNAME_LEN, "%s.%s", pDb->name, name);
244✔
1115
  memcpy(pDst->db, pDb->name, TSDB_DB_FNAME_LEN);
244✔
1116
  pDst->createdTime = taosGetTimestampMs();
244✔
1117
  pDst->updateTime = pDst->createdTime;
244✔
1118
  pDst->uid = mndGenerateUid(pDst->name, strlen(pDst->name));
244✔
1119
  pDst->dbUid = pDb->uid;
244✔
1120
  pDst->tagVer = 1;
244✔
1121
  pDst->colVer = 1;
244✔
1122
  pDst->smaVer = 1;
244✔
1123
  pDst->nextColId = 1;
244✔
1124
  pDst->maxdelay[0] = -1;
244✔
1125
  pDst->maxdelay[1] = -1;
244✔
1126
  pDst->watermark[0] = 5000;
244✔
1127
  pDst->watermark[1] = 5000;
244✔
1128
  pDst->ttl = 0;
244✔
1129
  pDst->keep = -1;
244✔
1130
  pDst->source = 0;
244✔
1131
  pDst->virtualStb = 0;
244✔
1132
  pDst->numOfColumns = sizeof(audit_columns) / sizeof(AuditColumnDef);
244✔
1133
  pDst->numOfTags = 1;
244✔
1134
  pDst->numOfFuncs = 0;
244✔
1135
  pDst->commentLen = -1;
244✔
1136
  pDst->pFuncs = NULL;
244✔
1137

1138
  pDst->ast1Len = 0;
244✔
1139
  pDst->ast2Len = 0;
244✔
1140

1141
  pDst->pColumns = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SSchema));
244✔
1142
  pDst->pTags = taosMemoryCalloc(1, pDst->numOfTags * sizeof(SSchema));
244✔
1143
  pDst->pCmpr = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SCmprObj));
244✔
1144
  if (pDst->pColumns == NULL || pDst->pTags == NULL || pDst->pCmpr == NULL) {
244✔
1145
    code = terrno;
×
1146
    TAOS_RETURN(code);
×
1147
  }
1148

1149
  if (pDst->nextColId < 0 || pDst->nextColId >= 0x7fff - pDst->numOfColumns - pDst->numOfTags) {
244✔
1150
    code = TSDB_CODE_OUT_OF_RANGE;
×
1151
    TAOS_RETURN(code);
×
1152
  }
1153

1154
  SSchema *pSchema = NULL;
244✔
1155
  for (int32_t i = 0; i < sizeof(audit_columns) / sizeof(AuditColumnDef); ++i) {
2,440✔
1156
    pSchema = &pDst->pColumns[pDst->nextColId - 1];
2,196✔
1157
    pSchema->type = audit_columns[i].type;
2,196✔
1158
    pSchema->bytes = audit_columns[i].bytes;
2,196✔
1159
    pSchema->flags = 1;
2,196✔
1160
    tstrncpy(pSchema->name, audit_columns[i].name, TSDB_COL_NAME_LEN);
2,196✔
1161
    pSchema->colId = pDst->nextColId;
2,196✔
1162
    // hasTypeMods = hasTypeMods || HAS_TYPE_MOD(pSchema);
1163
    SColCmpr *pColCmpr = &pDst->pCmpr[pDst->nextColId - 1];
2,196✔
1164
    pColCmpr->id = pSchema->colId;
2,196✔
1165
    pColCmpr->alg = audit_columns[i].alg;
2,196✔
1166
    pDst->nextColId++;
2,196✔
1167
  }
1168

1169
  // tag
1170
  pSchema = &pDst->pTags[0];
244✔
1171
  pSchema->type = TSDB_DATA_TYPE_VARCHAR;
244✔
1172
  pSchema->bytes = 64 + VARSTR_HEADER_SIZE;
244✔
1173
  SSCHMEA_SET_IDX_ON(pSchema);
244✔
1174
  tstrncpy(pSchema->name, "cluster_id", TSDB_COL_NAME_LEN);
244✔
1175
  pSchema->colId = pDst->nextColId;
244✔
1176
  pDst->nextColId++;
244✔
1177

1178
  /*
1179
    if (hasTypeMods) {
1180
      pDst->pExtSchemas = taosMemoryCalloc(pDst->numOfColumns, sizeof(SExtSchema));
1181
      if (!pDst->pExtSchemas) {
1182
        code = terrno;
1183
        TAOS_RETURN(code);
1184
      }
1185
      for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
1186
        SFieldWithOptions *pField = taosArrayGet(pCreate->pColumns, i);
1187
        pDst->pExtSchemas[i].typeMod = pField->typeMod;
1188
      }
1189
    }
1190
  */
1191
  TAOS_RETURN(code);
244✔
1192
}
1193

1194
static int32_t mndSetCreateAuditStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb,
244✔
1195
                                               SVgObj *pVgroup) {
1196
  int32_t code = 0;
244✔
1197
  SSdb   *pSdb = pMnode->pSdb;
244✔
1198

1199
  int32_t contLen;
244✔
1200

1201
  if (pVgroup == NULL) {
244✔
1202
    code = TSDB_CODE_INVALID_PARA;
×
1203
    TAOS_RETURN(code);
×
1204
  }
1205

1206
  void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, NULL, 0);
244✔
1207
  if (pReq == NULL) {
244✔
1208
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1209
    if (terrno != 0) code = terrno;
×
1210
    TAOS_RETURN(code);
×
1211
  }
1212

1213
  STransAction action = {0};
244✔
1214
  action.mTraceId = pTrans->mTraceId;
244✔
1215
  action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
244✔
1216
  action.pCont = pReq;
244✔
1217
  action.contLen = contLen;
244✔
1218
  action.msgType = TDMT_VND_CREATE_STB;
244✔
1219
  action.acceptableCode = TSDB_CODE_TDB_STB_ALREADY_EXIST;
244✔
1220
  action.retryCode = TSDB_CODE_TDB_STB_NOT_EXIST;
244✔
1221
  mInfo("trans:%d, add create stb to redo action", pTrans->id);
244✔
1222
  if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
244✔
1223
    taosMemoryFree(pReq);
×
1224
    TAOS_RETURN(code);
×
1225
  }
1226

1227
  TAOS_RETURN(code);
244✔
1228
}
1229

1230
// Note: pVgroup is expected to point to the first element of a vgroup array (e.g. pVgroups at the call site).
1231
// Only the first element is used for creating the audit super table.
1232
int32_t mndCreateAuditStb(SMnode *pMnode, SDbObj *pDb, SUserObj *pOperUser, STrans *pTrans, SVgObj *pVgroup) {
244✔
1233
  SStbObj stbObj = {0};
244✔
1234
  int32_t code = -1;
244✔
1235

1236
  char fullIdxName[TSDB_INDEX_FNAME_LEN * 2] = {0};
244✔
1237

1238
  TAOS_CHECK_GOTO(mndBuildAuditStb(pMnode, &stbObj, pDb), NULL, _OVER);
244✔
1239
  memcpy(stbObj.createUser, pOperUser->name, TSDB_USER_LEN);
244✔
1240
  stbObj.ownerId = pOperUser->uid;
244✔
1241

1242
  SSchema *pSchema = &(stbObj.pTags[0]);
244✔
1243
  if (mndGenIdxNameForFirstTag(fullIdxName, pDb->name, stbObj.name, pSchema->name) < 0) {
244✔
1244
    code = terrno;
×
1245
    goto _OVER;
×
1246
  }
1247

1248
  SSIdx idx = {0};
244✔
1249
  if (mndAcquireGlobalIdx(pMnode, fullIdxName, SDB_IDX, &idx) == 0 && idx.pIdx != NULL) {
244✔
1250
    code = TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST;
×
1251
    mndReleaseIdx(pMnode, idx.pIdx);
×
1252
    goto _OVER;
×
1253
  }
1254

1255
  SIdxObj idxObj = {0};
244✔
1256
  memcpy(idxObj.name, fullIdxName, TSDB_INDEX_FNAME_LEN);
244✔
1257
  memcpy(idxObj.stb, stbObj.name, TSDB_TABLE_FNAME_LEN);
244✔
1258
  memcpy(idxObj.db, stbObj.db, TSDB_DB_FNAME_LEN);
244✔
1259
  memcpy(idxObj.colName, pSchema->name, TSDB_COL_NAME_LEN);
244✔
1260
  memcpy(idxObj.createUser, pOperUser->name, TSDB_USER_LEN);
244✔
1261
  idxObj.ownerId = pOperUser->uid;
244✔
1262
  idxObj.createdTime = taosGetTimestampMs();
244✔
1263
  idxObj.uid = mndGenerateUid(fullIdxName, strlen(fullIdxName));
244✔
1264
  idxObj.stbUid = stbObj.uid;
244✔
1265
  idxObj.dbUid = stbObj.dbUid;
244✔
1266

1267
  mndTransSetDbName(pTrans, pDb->name, stbObj.name);
244✔
1268
  TAOS_CHECK_RETURN(mndTransCheckConflict(pMnode, pTrans));
244✔
1269
  TAOS_CHECK_GOTO(mndSetCreateIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
244✔
1270
  TAOS_CHECK_GOTO(mndSetCreateStbCommitLogs(pMnode, pTrans, pDb, &stbObj), NULL, _OVER);
244✔
1271
  TAOS_CHECK_GOTO(mndSetCreateAuditStbRedoActions(pMnode, pTrans, pDb, &stbObj, pVgroup), NULL, _OVER);
244✔
1272

1273
  code = 0;
244✔
1274

1275
_OVER:
244✔
1276
  if (mndStbActionDelete(pMnode->pSdb, &stbObj) != 0) mError("failed to mndStbActionDelete");
244✔
1277
  TAOS_RETURN(code);
244✔
1278
}
1279

1280
static int32_t mndProcessAuditRecordRsp(SRpcMsg *pRsp) {
472✔
1281
  int32_t code = 0;
472✔
1282

1283
  if (pRsp == NULL) {
472✔
1284
    mError("audit record rsp, null response message");
×
1285
    return -1;
×
1286
  }
1287

1288
  if (pRsp->code != 0) {
472✔
1289
    mError("audit record rsp failed, code:%d", pRsp->code);
×
1290
    return pRsp->code;
×
1291
  }
1292

1293
  SMnode *pMnode = pRsp->info.node;
472✔
1294
  SSdb   *pSdb = pMnode->pSdb;
472✔
1295
  (void)pMnode;  // currently unused, kept for potential future use
1296
  (void)pSdb;    // currently unused, kept for potential future use
1297

1298
  mDebug("audit record rsp succeeded, code:%d", pRsp->code);
472✔
1299

1300
  // no need to implement this rsp, since we do not care about the result of audit record insertion
1301

1302
  return code;
472✔
1303
}
1304

1305
int32_t mndAddStbToTrans(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
2,062,797✔
1306
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
2,062,797✔
1307
  TAOS_CHECK_RETURN(mndTransCheckConflict(pMnode, pTrans));
2,062,797✔
1308
  TAOS_CHECK_RETURN(mndSetCreateStbCommitLogs(pMnode, pTrans, pDb, pStb));
2,056,902✔
1309
  TAOS_CHECK_RETURN(mndSetCreateStbRedoActions(pMnode, pTrans, pDb, pStb));
2,056,902✔
1310
  TAOS_CHECK_RETURN(mndSetCreateStbUndoActions(pMnode, pTrans, pDb, pStb));
2,056,902✔
1311
  return 0;
2,056,902✔
1312
}
1313

1314
static int32_t mndProcessTtlTimer(SRpcMsg *pReq) {
3,521,620✔
1315
  SMnode           *pMnode = pReq->info.node;
3,521,620✔
1316
  SSdb             *pSdb = pMnode->pSdb;
3,521,620✔
1317
  SVgObj           *pVgroup = NULL;
3,521,620✔
1318
  void             *pIter = NULL;
3,521,620✔
1319
  SVDropTtlTableReq ttlReq = {
3,521,620✔
1320
      .timestampSec = taosGetTimestampSec(), .ttlDropMaxCount = tsTtlBatchDropNum, .nUids = 0, .pTbUids = NULL};
3,521,620✔
1321
  int32_t reqLen = tSerializeSVDropTtlTableReq(NULL, 0, &ttlReq);
3,521,620✔
1322
  int32_t contLen = reqLen + sizeof(SMsgHead);
3,521,620✔
1323

1324
  mDebug("start to process ttl timer");
3,521,620✔
1325

1326
  while (1) {
13,611,206✔
1327
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
17,132,826✔
1328
    if (pIter == NULL) break;
17,132,826✔
1329

1330
    if (pVgroup->mountVgId) {
13,611,206✔
1331
      sdbRelease(pSdb, pVgroup);
1,100✔
1332
      continue;
1,100✔
1333
    }
1334

1335
    int32_t   code = 0;
13,610,106✔
1336
    SMsgHead *pHead = rpcMallocCont(contLen);
13,610,106✔
1337
    if (pHead == NULL) {
13,610,106✔
1338
      sdbRelease(pSdb, pVgroup);
×
1339
      continue;
×
1340
    }
1341
    pHead->contLen = htonl(contLen);
13,610,106✔
1342
    pHead->vgId = htonl(pVgroup->vgId);
13,610,106✔
1343
    if ((code = tSerializeSVDropTtlTableReq((char *)pHead + sizeof(SMsgHead), reqLen, &ttlReq)) < 0) {
13,610,106✔
1344
      mError("vgId:%d, failed to serialize drop ttl table request since %s", pVgroup->vgId, tstrerror(code));
×
1345
      sdbRelease(pSdb, pVgroup);
×
1346
      continue;
×
1347
    }
1348

1349
    SRpcMsg rpcMsg = {
13,610,106✔
1350
        .msgType = TDMT_VND_FETCH_TTL_EXPIRED_TBS, .pCont = pHead, .contLen = contLen, .info = pReq->info};
1351
    SEpSet epSet = mndGetVgroupEpset(pMnode, pVgroup);
13,610,106✔
1352
    code = tmsgSendReq(&epSet, &rpcMsg);
13,610,106✔
1353
    if (code != 0) {
13,610,106✔
1354
      mError("vgId:%d, failed to send drop ttl table request to vnode since 0x%x", pVgroup->vgId, code);
17,190✔
1355
    } else {
1356
      mDebug("vgId:%d, send drop ttl table request to vnode, time:%" PRId32, pVgroup->vgId, ttlReq.timestampSec);
13,592,916✔
1357
    }
1358
    sdbRelease(pSdb, pVgroup);
13,610,106✔
1359
  }
1360

1361
  return 0;
3,521,620✔
1362
}
1363

1364
#if 0
1365
static int32_t mndProcessTrimDbTimer(SRpcMsg *pReq) {
1366
  SMnode     *pMnode = pReq->info.node;
1367
  SSdb       *pSdb = pMnode->pSdb;
1368
  SVgObj     *pVgroup = NULL;
1369
  void       *pIter = NULL;
1370
  SVTrimDbReq trimReq = {0};
1371
  trimReq.compactStartTime = taosGetTimestampMs();
1372
  trimReq.tw.skey = INT64_MIN;
1373
  trimReq.tw.ekey = trimReq.compactStartTime;
1374
  trimReq.compactId = 0;  // TODO: use the real value
1375
  trimReq.metaOnly = 0;
1376
  trimReq.triggerType = TSDB_TRIGGER_AUTO;
1377
  int32_t reqLen = tSerializeSVTrimDbReq(NULL, 0, &trimReq);
1378
  int32_t contLen = reqLen + sizeof(SMsgHead);
1379

1380
  while (1) {
1381
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
1382
    if (pIter == NULL) break;
1383
    if (pVgroup->mountVgId) {
1384
      sdbRelease(pSdb, pVgroup);
1385
      continue;
1386
    }
1387

1388
    int32_t code = 0;
1389

1390
    SMsgHead *pHead = rpcMallocCont(contLen);
1391
    if (pHead == NULL) {
1392
      sdbCancelFetch(pSdb, pVgroup);
1393
      sdbRelease(pSdb, pVgroup);
1394
      continue;
1395
    }
1396
    pHead->contLen = htonl(contLen);
1397
    pHead->vgId = htonl(pVgroup->vgId);
1398
    trimReq.dbUid = pVgroup->dbUid;
1399
    (void)snprintf(trimReq.db, sizeof(trimReq.db), "%s", pVgroup->dbName);
1400
    if ((code = tSerializeSVTrimDbReq((char *)pHead + sizeof(SMsgHead), reqLen, &trimReq)) < 0) {
1401
      mError("vgId:%d, failed to serialize trim db request since %s", pVgroup->vgId, tstrerror(code));
1402
    }
1403

1404
    SRpcMsg rpcMsg = {.msgType = TDMT_VND_TRIM, .pCont = pHead, .contLen = contLen};
1405
    SEpSet  epSet = mndGetVgroupEpset(pMnode, pVgroup);
1406
    code = tmsgSendReq(&epSet, &rpcMsg);
1407
    if (code != 0) {
1408
      mError("vgId:%d, timer failed to send vnode-trim request to vnode since 0x%x", pVgroup->vgId, code);
1409
    } else {
1410
      mInfo("vgId:%d, timer send vnode-trim request to vnode, time:%" PRIi64 " ms", pVgroup->vgId, trimReq.tw.ekey);
1411
    }
1412
    sdbRelease(pSdb, pVgroup);
1413
  }
1414

1415
  return 0;
1416
}
1417
#endif
1418

1419
static int32_t mndFindSuperTableTagIndex(const SStbObj *pStb, const char *tagName) {
3,729,773✔
1420
  for (int32_t tag = 0; tag < pStb->numOfTags; tag++) {
30,180,791✔
1421
    if (strcmp(pStb->pTags[tag].name, tagName) == 0) {
27,389,890✔
1422
      return tag;
938,872✔
1423
    }
1424
  }
1425

1426
  return -1;
2,790,901✔
1427
}
1428

1429
static int32_t mndFindSuperTableColumnIndex(const SStbObj *pStb, const char *colName) {
5,894,097✔
1430
  for (int32_t col = 0; col < pStb->numOfColumns; col++) {
297,904,281✔
1431
    if (strcmp(pStb->pColumns[col].name, colName) == 0) {
295,035,074✔
1432
      return col;
3,024,890✔
1433
    }
1434
  }
1435

1436
  return -1;
2,869,207✔
1437
}
1438

1439
static bool mndValidateSchema(SSchema *pSchemas, int32_t nSchema, SArray *pFields, int32_t maxLen) {
3,041,287✔
1440
  int32_t rowLen = 0;
3,041,287✔
1441
  for (int32_t i = 0; i < nSchema; ++i) {
177,883,643✔
1442
    rowLen += (pSchemas + i)->bytes;
174,842,356✔
1443
  }
1444

1445
  int32_t nField = taosArrayGetSize(pFields);
3,041,287✔
1446
  for (int32_t i = 0; i < nField; ++i) {
6,082,574✔
1447
    rowLen += ((SField *)TARRAY_GET_ELEM(pFields, i))->bytes;
3,041,287✔
1448
  }
1449

1450
  return rowLen <= maxLen;
3,041,287✔
1451
}
1452

1453
static int32_t mndBuildStbFromAlter(SStbObj *pStb, SStbObj *pDst, SMCreateStbReq *createReq) {
35,275✔
1454
  int32_t code = 0;
35,275✔
1455
  taosRLockLatch(&pStb->lock);
35,275✔
1456
  memcpy(pDst, pStb, sizeof(SStbObj));
35,275✔
1457
  taosRUnLockLatch(&pStb->lock);
35,275✔
1458

1459
  pDst->source = createReq->source;
35,275✔
1460
  pDst->updateTime = taosGetTimestampMs();
35,275✔
1461
  pDst->numOfColumns = createReq->numOfColumns;
35,275✔
1462
  pDst->numOfTags = createReq->numOfTags;
35,275✔
1463
  pDst->pColumns = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SSchema));
35,275✔
1464
  pDst->pTags = taosMemoryCalloc(1, pDst->numOfTags * sizeof(SSchema));
35,275✔
1465
  pDst->pCmpr = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SColCmpr));
35,275✔
1466
  pDst->pExtSchemas = taosMemoryCalloc(pDst->numOfColumns, sizeof(SExtSchema));
35,275✔
1467

1468
  if (pDst->pColumns == NULL || pDst->pTags == NULL || pDst->pCmpr == NULL || pDst->pExtSchemas == NULL) {
35,275✔
1469
    code = terrno;
×
1470
    TAOS_RETURN(code);
×
1471
  }
1472

1473
  if (pDst->nextColId < 0 || pDst->nextColId >= 0x7fff - pDst->numOfColumns - pDst->numOfTags) {
35,275✔
1474
    code = TSDB_CODE_OUT_OF_RANGE;
×
1475
    TAOS_RETURN(code);
×
1476
  }
1477

1478
  for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
254,801✔
1479
    SFieldWithOptions *pField = taosArrayGet(createReq->pColumns, i);
219,526✔
1480
    SSchema           *pSchema = &pDst->pColumns[i];
219,526✔
1481
    pSchema->type = pField->type;
219,526✔
1482
    pSchema->bytes = pField->bytes;
219,526✔
1483
    pSchema->flags = pField->flags;
219,526✔
1484
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
219,526✔
1485
    int32_t cIndex = mndFindSuperTableColumnIndex(pStb, pField->name);
219,526✔
1486
    if (cIndex >= 0) {
219,526✔
1487
      pSchema->colId = pStb->pColumns[cIndex].colId;
203,102✔
1488
    } else {
1489
      pSchema->colId = pDst->nextColId++;
16,424✔
1490
    }
1491
  }
1492

1493
  for (int32_t i = 0; i < pDst->numOfTags; ++i) {
237,370✔
1494
    SField  *pField = taosArrayGet(createReq->pTags, i);
202,095✔
1495
    SSchema *pSchema = &pDst->pTags[i];
202,095✔
1496
    pSchema->type = pField->type;
202,095✔
1497
    pSchema->bytes = pField->bytes;
202,095✔
1498
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
202,095✔
1499
    int32_t cIndex = mndFindSuperTableTagIndex(pStb, pField->name);
202,095✔
1500
    if (cIndex >= 0) {
202,095✔
1501
      pSchema->colId = pStb->pTags[cIndex].colId;
190,864✔
1502
    } else {
1503
      pSchema->colId = pDst->nextColId++;
11,231✔
1504
    }
1505
  }
1506
  for (int32_t i = 0; i < pDst->numOfColumns; i++) {
254,801✔
1507
    SColCmpr          *p = pDst->pCmpr + i;
219,526✔
1508
    SFieldWithOptions *pField = taosArrayGet(createReq->pColumns, i);
219,526✔
1509
    SSchema           *pSchema = &pDst->pColumns[i];
219,526✔
1510
    p->id = pSchema->colId;
219,526✔
1511
    if (pField->compress == 0) {
219,526✔
1512
      p->alg = createDefaultColCmprByType(pSchema->type);
×
1513
    } else {
1514
      p->alg = pField->compress;
219,526✔
1515
    }
1516
    if (pField->flags & COL_HAS_TYPE_MOD) {
219,526✔
1517
      pDst->pExtSchemas[i].typeMod = pField->typeMod;
4,784✔
1518
    }
1519
  }
1520
  pDst->tagVer = createReq->tagVer;
35,275✔
1521
  pDst->colVer = createReq->colVer;
35,275✔
1522
  return TSDB_CODE_SUCCESS;
35,275✔
1523
}
1524

1525
// used for tmq_get_json_meta to build alter msg
1526
static void buildAlterMsg(SStbObj *pStb, SStbObj *pDst, void** pAlterBuf, int32_t* len){
35,275✔
1527
  SMAlterStbReq alterReq = {0};
35,275✔
1528
  alterReq.pFields = taosArrayInit(2, sizeof(SField));
35,275✔
1529
  if (NULL == alterReq.pFields) {
35,275✔
1530
    mError("failed to init alter fields array");
×
1531
    goto END;
×
1532
  }
1533
  tstrncpy(alterReq.name, pStb->name, TSDB_TABLE_FNAME_LEN);
35,275✔
1534
  for (int32_t i = 0; i < pDst->numOfColumns && taosArrayGetSize(alterReq.pFields) == 0; ++i) {
245,671✔
1535
    SSchema           *pSchema = &pDst->pColumns[i];
210,396✔
1536
    int32_t cIndex = mndFindSuperTableColumnIndex(pStb, pSchema->name);
210,396✔
1537
    if (cIndex >= 0 && pSchema->bytes == pStb->pColumns[cIndex].bytes) {
210,396✔
1538
      continue;
190,295✔
1539
    }
1540
    if (cIndex < 0) {
20,101✔
1541
      alterReq.alterType = TSDB_ALTER_TABLE_ADD_COLUMN;
16,424✔
1542
    } else if (pSchema->bytes > pStb->pColumns[cIndex].bytes){
3,677✔
1543
      alterReq.alterType = TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES;
3,677✔
1544
    }
1545
    SField *pAlterField = taosArrayReserve(alterReq.pFields, 1);
20,101✔
1546
    pAlterField->type = pSchema->type;
20,101✔
1547
    pAlterField->bytes = pSchema->bytes;
20,101✔
1548
    tstrncpy(pAlterField->name, pSchema->name, TSDB_COL_NAME_LEN);
20,101✔
1549
    mDebug("alter column name:%s, type:%d, bytes:%d", pAlterField->name, pAlterField->type, pAlterField->bytes);
20,101✔
1550
  }
1551

1552
  for (int32_t i = 0; i < pDst->numOfTags && taosArrayGetSize(alterReq.pFields) == 0; ++i) {
143,464✔
1553
    SSchema *pSchema = &pDst->pTags[i];
108,189✔
1554
    int32_t cIndex = mndFindSuperTableTagIndex(pStb, pSchema->name);
108,189✔
1555
    if (cIndex >= 0 && pSchema->bytes == pStb->pTags[cIndex].bytes) {
108,189✔
1556
      continue;
94,211✔
1557
    }
1558
    if (cIndex < 0) {
13,978✔
1559
      alterReq.alterType = TSDB_ALTER_TABLE_ADD_TAG;
11,231✔
1560
    } else if (pSchema->bytes > pStb->pTags[cIndex].bytes){
2,747✔
1561
      alterReq.alterType = TSDB_ALTER_TABLE_UPDATE_TAG_BYTES;
2,747✔
1562
    }
1563
    SField *pAlterField = taosArrayReserve(alterReq.pFields, 1);
13,978✔
1564
    pAlterField->type = pSchema->type;
13,978✔
1565
    pAlterField->bytes = pSchema->bytes;
13,978✔
1566
    tstrncpy(pAlterField->name, pSchema->name, TSDB_COL_NAME_LEN);
13,978✔
1567
    mDebug("alter tag name:%s, type:%d, bytes:%d", pAlterField->name, pAlterField->type, pAlterField->bytes);
13,978✔
1568
  }
1569
  alterReq.numOfFields = taosArrayGetSize(alterReq.pFields);
35,275✔
1570
  if (alterReq.numOfFields == 0) {
35,275✔
1571
    mError("no valid alter field found");
1,196✔
1572
    goto END;
1,196✔
1573
  }
1574

1575
  int32_t contLen = tSerializeSMAlterStbReq(NULL, 0, &alterReq);
34,079✔
1576
  if (contLen <= 0) {
34,079✔
1577
    mError("failed to get alter stb req len");
×
1578
    goto END;
×
1579
  }
1580
  void*   buf = taosMemoryMalloc(contLen);
34,079✔
1581
  if (buf == NULL) {
34,079✔
1582
    mError("failed to malloc alter stb req buf");
×
1583
    goto END;
×
1584
  }
1585
  int32_t code = tSerializeSMAlterStbReq(buf, contLen, &alterReq);
34,079✔
1586
  if (code <= TSDB_CODE_SUCCESS) {
34,079✔
1587
    mError("failed to serialize alter stb req %d", code);
×
1588
    taosMemoryFreeClear(buf);
×
1589
    goto END;
×
1590
  }
1591
  *pAlterBuf = buf;
34,079✔
1592
  *len = contLen;
34,079✔
1593
END:
35,275✔
1594
  taosArrayDestroy(alterReq.pFields);
35,275✔
1595
}
35,275✔
1596

1597
static int32_t mndProcessCreateStbReq(SRpcMsg *pReq) {
2,048,914✔
1598
  SMnode        *pMnode = pReq->info.node;
2,048,914✔
1599
  int32_t        code = -1;
2,048,914✔
1600
  SStbObj       *pStb = NULL;
2,048,914✔
1601
  SDbObj        *pDb = NULL;
2,048,914✔
1602
  SUserObj      *pOperUser = NULL;
2,048,914✔
1603
  SMCreateStbReq createReq = {0};
2,048,914✔
1604
  bool           isAlter = false;
2,048,914✔
1605
  SHashObj      *pHash = NULL;
2,048,914✔
1606
  int64_t        tss = taosGetTimestampMs();
2,048,914✔
1607

1608
  if (tDeserializeSMCreateStbReq(pReq->pCont, pReq->contLen, &createReq) != 0) {
2,048,914✔
1609
    code = TSDB_CODE_INVALID_MSG;
×
1610
    goto _OVER;
×
1611
  }
1612

1613
  mInfo("stb:%s, start to create", createReq.name);
2,048,914✔
1614
  if (mndCheckCreateStbReq(&createReq) != 0) {
2,048,914✔
1615
    code = TSDB_CODE_INVALID_MSG;
×
1616
    goto _OVER;
×
1617
  }
1618

1619
  pStb = mndAcquireStb(pMnode, createReq.name);
2,048,914✔
1620
  if (pStb != NULL) {
2,048,914✔
1621
    if (createReq.igExists) {
54,031✔
1622
      if (createReq.source == TD_REQ_FROM_APP) {
52,566✔
1623
        mInfo("stb:%s, already exist, ignore exist is set", createReq.name);
2,880✔
1624
        code = 0;
2,880✔
1625
        goto _OVER;
2,880✔
1626
      } else if (pStb->uid != createReq.suid) {
49,686✔
1627
        mInfo("stb:%s, alter table does not need to be done, because table is deleted", createReq.name);
×
1628
        code = 0;
×
1629
        goto _OVER;
×
1630
      } else if (createReq.tagVer > 0 || createReq.colVer > 0) {
84,961✔
1631
        int32_t tagDelta = createReq.tagVer - pStb->tagVer;
49,686✔
1632
        int32_t colDelta = createReq.colVer - pStb->colVer;
49,686✔
1633
        mInfo("stb:%s, already exist while create, input tagVer:%d colVer:%d, exist tagVer:%d colVer:%d",
49,686✔
1634
              createReq.name, createReq.tagVer, createReq.colVer, pStb->tagVer, pStb->colVer);
1635
        if (tagDelta <= 0 && colDelta <= 0) {
49,686✔
1636
          mInfo("stb:%s, schema version is not incremented and nothing needs to be done", createReq.name);
14,411✔
1637
          code = 0;
14,411✔
1638
          goto _OVER;
14,411✔
1639
        } else if ((tagDelta == 1 && colDelta == 0) || (tagDelta == 0 && colDelta == 1) ||
35,275✔
1640
                   (pStb->colVer == 1 && createReq.colVer > 1) || (pStb->tagVer == 1 && createReq.tagVer > 1)) {
×
1641
          isAlter = true;
35,275✔
1642
          mInfo("stb:%s, schema version is only increased by 1 number, do alter operation", createReq.name);
35,275✔
1643
        } else {
1644
          mError("stb:%s, schema version increase more than 1 number, error is returned", createReq.name);
×
1645
          code = TSDB_CODE_MND_INVALID_SCHEMA_VER;
×
1646
          goto _OVER;
×
1647
        }
1648
      } else {
1649
        mError("stb:%s, already exist while create, input tagVer:%d colVer:%d is invalid, origin tagVer:%d colVer:%d",
×
1650
               createReq.name, createReq.tagVer, createReq.colVer, pStb->tagVer, pStb->colVer);
1651
        code = TSDB_CODE_MND_INVALID_SCHEMA_VER;
×
1652
        goto _OVER;
×
1653
      }
1654
    } else {
1655
      code = TSDB_CODE_MND_STB_ALREADY_EXIST;
1,465✔
1656
      goto _OVER;
1,465✔
1657
    }
1658
  } else if (terrno != TSDB_CODE_MND_STB_NOT_EXIST) {
1,994,883✔
1659
    goto _OVER;
×
1660
  } else if ((createReq.source == TD_REQ_FROM_TAOX_OLD || createReq.source == TD_REQ_FROM_TAOX || createReq.source == TD_REQ_FROM_SML) &&
1,994,883✔
1661
             (createReq.tagVer != 1 || createReq.colVer != 1)) {
20,737✔
1662
    mInfo("stb:%s, alter table does not need to be done, because table is deleted", createReq.name);
2,098✔
1663
    code = 0;
2,098✔
1664
    goto _OVER;
2,098✔
1665
  }
1666

1667
  pHash = taosHashInit(createReq.numOfColumns + createReq.numOfTags, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY),
2,028,060✔
1668
                       false, HASH_NO_LOCK);
1669
  if (pHash == NULL) {
2,028,060✔
1670
    code = TSDB_CODE_OUT_OF_MEMORY;
×
1671
    goto _OVER;
×
1672
  }
1673

1674
  for (int32_t i = 0; i < createReq.numOfColumns; ++i) {
164,625,338✔
1675
    SFieldWithOptions *pField = taosArrayGet(createReq.pColumns, i);
162,597,278✔
1676
    if ((code = taosHashPut(pHash, pField->name, strlen(pField->name), NULL, 0)) != 0) {
162,597,278✔
1677
      if (code == TSDB_CODE_DUP_KEY) {
×
1678
        code = TSDB_CODE_TSC_DUP_COL_NAMES;
×
1679
      }
1680
      goto _OVER;
×
1681
    }
1682
  }
1683

1684
  for (int32_t i = 0; i < createReq.numOfTags; ++i) {
10,533,858✔
1685
    SField *pField = taosArrayGet(createReq.pTags, i);
8,505,997✔
1686
    if ((code = taosHashPut(pHash, pField->name, strlen(pField->name), NULL, 0)) != 0) {
8,505,997✔
1687
      if (code == TSDB_CODE_DUP_KEY) {
199✔
1688
        code = TSDB_CODE_TSC_DUP_COL_NAMES;
199✔
1689
      }
1690
      goto _OVER;
199✔
1691
    }
1692
  }
1693

1694
  pDb = mndAcquireDbByStb(pMnode, createReq.name);
2,027,861✔
1695
  if (pDb == NULL) {
2,027,861✔
1696
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
1697
    goto _OVER;
×
1698
  }
1699

1700
  if ((code = mndAcquireUser(pMnode, (RPC_MSG_USER(pReq)), &pOperUser))) {
2,027,861✔
1701
    goto _OVER;
×
1702
  }
1703

1704
  if ((code = mndCheckDbPrivilege(pMnode, RPC_MSG_USER(pReq), RPC_MSG_TOKEN(pReq), MND_OPER_USE_DB, pDb))) {
2,027,861✔
1705
    goto _OVER;
×
1706
  }
1707

1708
  if ((code =
2,027,861✔
1709
           mndCheckDbPrivilegeByNameRecF(pMnode, pOperUser, pDb->cfg.isAudit ? PRIV_AUDIT_TBL_CREATE : PRIV_TBL_CREATE,
2,027,861✔
1710
                                         pDb->cfg.isAudit ? PRIV_OBJ_CLUSTER : PRIV_OBJ_DB, pDb->name, NULL))) {
2,027,861✔
1711
    goto _OVER;
×
1712
  }
1713

1714
  if (pDb->cfg.isMount) {
2,027,861✔
1715
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
×
1716
    goto _OVER;
×
1717
  }
1718

1719
  int32_t numOfStbs = -1;
2,027,861✔
1720
  if ((code = mndGetNumOfStbs(pMnode, pDb->name, &numOfStbs)) != 0) {
2,027,861✔
1721
    goto _OVER;
×
1722
  }
1723

1724
  if (pDb->cfg.numOfStables == 1 && numOfStbs != 0) {
2,027,861✔
1725
    code = TSDB_CODE_MND_SINGLE_STB_MODE_DB;
×
1726
    goto _OVER;
×
1727
  }
1728

1729
  if ((code = grantCheck(TSDB_GRANT_STABLE)) < 0) {
2,027,861✔
1730
    goto _OVER;
×
1731
  }
1732

1733
  if (isAlter) {
2,027,861✔
1734
    bool    needRsp = false;
35,275✔
1735
    SStbObj pDst = {0};
35,275✔
1736
    if ((code = mndBuildStbFromAlter(pStb, &pDst, &createReq)) != 0) {
35,275✔
1737
      taosMemoryFreeClear(pDst.pTags);
×
1738
      taosMemoryFreeClear(pDst.pColumns);
×
1739
      taosMemoryFreeClear(pDst.pCmpr);
×
1740
      taosMemoryFreeClear(pDst.pExtSchemas);
×
1741
      goto _OVER;
×
1742
    }
1743
    void* buf = NULL;
35,275✔
1744
    int32_t contLen = 0;
35,275✔
1745
    buildAlterMsg(pStb, &pDst, &buf, &contLen);
35,275✔
1746
    code = mndAlterStbImp(pMnode, pReq, pDb, &pDst, needRsp, buf, contLen);
35,275✔
1747
    taosMemoryFree(buf);
35,275✔
1748
    taosMemoryFreeClear(pDst.pTags);
35,275✔
1749
    taosMemoryFreeClear(pDst.pColumns);
35,275✔
1750
    taosMemoryFreeClear(pDst.pCmpr);
35,275✔
1751
    taosMemoryFreeClear(pDst.pExtSchemas);
35,275✔
1752
  } else {
1753
    code = mndCreateStb(pMnode, pReq, &createReq, pDb, pOperUser);
1,992,586✔
1754
  }
1755
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
2,027,861✔
1756

1757
  if (tsAuditLevel >= AUDIT_LEVEL_DATABASE) {
2,027,861✔
1758
    SName name = {0};
2,027,861✔
1759
    TAOS_CHECK_RETURN(tNameFromString(&name, createReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
2,027,861✔
1760

1761
    int64_t tse = taosGetTimestampMs();
2,027,861✔
1762
    double  duration = (double)(tse - tss);
2,027,861✔
1763
    duration = duration / 1000;
2,027,861✔
1764
    if (createReq.sql == NULL && createReq.sqlLen == 0) {
2,029,652✔
1765
      char detail[1000] = {0};
407,331✔
1766

1767
      (void)snprintf(detail, sizeof(detail), "dbname:%s, stable name:%s", name.dbname, name.tname);
407,331✔
1768

1769
      auditRecord(pReq, pMnode->clusterId, "createStb", name.dbname, name.tname, detail, strlen(detail), duration, 0);
407,331✔
1770
    } else {
1771
      auditRecord(pReq, pMnode->clusterId, "createStb", name.dbname, name.tname, createReq.sql, createReq.sqlLen,
1,620,530✔
1772
                  duration, 0);
1773
    }
1774
  }
1775
_OVER:
2,045,014✔
1776
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
2,048,914✔
1777
    mError("stb:%s, failed to create since %s", createReq.name, tstrerror(code));
8,737✔
1778
  }
1779

1780
  mndReleaseStb(pMnode, pStb);
2,048,914✔
1781
  mndReleaseDb(pMnode, pDb);
2,048,914✔
1782
  mndReleaseUser(pMnode, pOperUser);
2,048,914✔
1783
  tFreeSMCreateStbReq(&createReq);
2,048,914✔
1784

1785
  if (pHash != NULL) {
2,048,914✔
1786
    taosHashCleanup(pHash);
2,028,060✔
1787
  }
1788

1789
  TAOS_RETURN(code);
2,048,914✔
1790
}
1791

1792
static int32_t mndCheckAlterStbReq(SMAlterStbReq *pAlter) {
5,985,913✔
1793
  int32_t code = 0;
5,985,913✔
1794
  if (pAlter->commentLen >= 0) return 0;
5,985,913✔
1795
  if (pAlter->ttl != 0) return 0;
14,394✔
1796
  if (pAlter->keep != -1) return 0;
14,394✔
1797
  if (pAlter->secureDelete >= 0) return 0;
×
1798

1799
  if (pAlter->numOfFields < 1 || pAlter->numOfFields != (int32_t)taosArrayGetSize(pAlter->pFields)) {
×
1800
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
1801
    TAOS_RETURN(code);
×
1802
  }
1803

1804
  for (int32_t i = 0; i < pAlter->numOfFields; ++i) {
×
1805
    SField *pField = taosArrayGet(pAlter->pFields, i);
×
1806
    if (pField->name[0] == 0) {
×
1807
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
1808
      TAOS_RETURN(code);
×
1809
    }
1810
  }
1811

1812
  TAOS_RETURN(code);
×
1813
}
1814

1815
int32_t mndAllocStbSchemas(const SStbObj *pOld, SStbObj *pNew) {
5,723,051✔
1816
  pNew->pTags = taosMemoryCalloc(pNew->numOfTags, sizeof(SSchema));
5,723,051✔
1817
  pNew->pColumns = taosMemoryCalloc(pNew->numOfColumns, sizeof(SSchema));
5,723,051✔
1818
  pNew->pCmpr = taosMemoryCalloc(pNew->numOfColumns, sizeof(SColCmpr));
5,723,051✔
1819
  if (pNew->pTags == NULL || pNew->pColumns == NULL || pNew->pCmpr == NULL) {
5,723,051✔
1820
    TAOS_RETURN(terrno);
×
1821
  }
1822

1823
  memcpy(pNew->pColumns, pOld->pColumns, sizeof(SSchema) * pOld->numOfColumns);
5,723,051✔
1824
  memcpy(pNew->pTags, pOld->pTags, sizeof(SSchema) * pOld->numOfTags);
5,723,051✔
1825
  memcpy(pNew->pCmpr, pOld->pCmpr, sizeof(SColCmpr) * pOld->numOfColumns);
5,723,051✔
1826
  if (pOld->pExtSchemas) {
5,723,051✔
1827
    pNew->pExtSchemas = taosMemoryCalloc(pNew->numOfColumns, sizeof(SExtSchema));
4,596,309✔
1828
    if (pNew->pExtSchemas == NULL) {
4,596,309✔
1829
      TAOS_RETURN(terrno);
×
1830
    }
1831
    memcpy(pNew->pExtSchemas, pOld->pExtSchemas, sizeof(SExtSchema) * pOld->numOfColumns);
4,596,309✔
1832
  }
1833

1834
  TAOS_RETURN(0);
5,723,051✔
1835
}
1836

1837
static int32_t mndUpdateTableOptions(const SStbObj *pOld, SStbObj *pNew, char *pComment, int32_t commentLen,
25,490✔
1838
                                     int32_t ttl, int64_t keep, int8_t secureDelete) {
1839
  int32_t code = 0;
25,490✔
1840
  if (commentLen > 0) {
25,490✔
1841
    pNew->commentLen = commentLen;
6,255✔
1842
    pNew->comment = taosMemoryCalloc(1, commentLen + 1);
6,255✔
1843
    if (pNew->comment == NULL) {
6,255✔
1844
      terrno = TSDB_CODE_OUT_OF_MEMORY;
×
1845
      return -1;
×
1846
    }
1847
    memcpy(pNew->comment, pComment, commentLen + 1);
6,255✔
1848
  } else if (commentLen == 0) {
19,235✔
1849
    pNew->commentLen = 0;
4,841✔
1850
  } else {
1851
  }
1852

1853
  if (ttl >= 0) {
25,490✔
1854
    pNew->ttl = ttl;
25,490✔
1855
  }
1856

1857
  if (keep > 0) {
25,490✔
1858
    pNew->keep = keep;
13,793✔
1859
  }
1860

1861
  if (secureDelete >= 0) {
25,490✔
1862
    pNew->secureDelete = secureDelete;
601✔
1863
  }
1864

1865
  if ((code = mndAllocStbSchemas(pOld, pNew)) != 0) {
25,490✔
1866
    TAOS_RETURN(code);
×
1867
  }
1868
  TAOS_RETURN(code);
25,490✔
1869
}
1870

1871
static int32_t mndAddSuperTableTag(const SStbObj *pOld, SStbObj *pNew, SArray *pFields, int32_t ntags) {
299,947✔
1872
  int32_t code = 0;
299,947✔
1873
  if (pOld->numOfTags + ntags > TSDB_MAX_TAGS) {
299,947✔
1874
    code = TSDB_CODE_MND_TOO_MANY_TAGS;
×
1875
    TAOS_RETURN(code);
×
1876
  }
1877

1878
  int32_t maxColumns = pOld->virtualStb ? TSDB_MAX_COLUMNS : TSDB_MAX_COLUMNS_NON_VIRTUAL;
299,947✔
1879
  if (pOld->numOfColumns + ntags + pOld->numOfTags > maxColumns) {
299,947✔
1880
    code = TSDB_CODE_MND_TOO_MANY_COLUMNS;
×
1881
    TAOS_RETURN(code);
×
1882
  }
1883

1884
  if (!mndValidateSchema(pOld->pTags, pOld->numOfTags, pFields, TSDB_MAX_TAGS_LEN)) {
299,947✔
1885
    code = TSDB_CODE_PAR_INVALID_TAGS_LENGTH;
23,940✔
1886
    TAOS_RETURN(code);
23,940✔
1887
  }
1888

1889
  pNew->numOfTags = pNew->numOfTags + ntags;
276,007✔
1890
  if ((code = mndAllocStbSchemas(pOld, pNew)) != 0) {
276,007✔
1891
    TAOS_RETURN(code);
×
1892
  }
1893

1894
  if (pNew->nextColId < 0 || pNew->nextColId >= 0x7fff - ntags) {
276,007✔
1895
    code = TSDB_CODE_OUT_OF_RANGE;
1,178✔
1896
    TAOS_RETURN(code);
1,178✔
1897
  }
1898

1899
  for (int32_t i = 0; i < ntags; i++) {
479,966✔
1900
    SField *pField = taosArrayGet(pFields, i);
274,829✔
1901
    if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
274,829✔
1902
      code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
2,269✔
1903
      TAOS_RETURN(code);
2,269✔
1904
    }
1905

1906
    if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
272,560✔
1907
      code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
67,423✔
1908
      TAOS_RETURN(code);
67,423✔
1909
    }
1910

1911
    SSchema *pSchema = &pNew->pTags[pOld->numOfTags + i];
205,137✔
1912
    pSchema->bytes = pField->bytes;
205,137✔
1913
    pSchema->type = pField->type;
205,137✔
1914
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
205,137✔
1915
    if (pNew->nextColId > INT16_MAX) {
205,137✔
1916
      code = TSDB_CODE_MND_EXCEED_MAX_COL_ID;
×
1917
      TAOS_RETURN(code);
×
1918
    }
1919
    pSchema->colId = pNew->nextColId;
205,137✔
1920
    pNew->nextColId++;
205,137✔
1921

1922
    mInfo("stb:%s, start to add tag %s", pNew->name, pSchema->name);
205,137✔
1923
  }
1924

1925
  pNew->tagVer++;
205,137✔
1926
  TAOS_RETURN(code);
205,137✔
1927
}
1928

1929
static int32_t mndCheckAlterColForTSma(SMnode *pMnode, const char *stbFullName, int64_t suid, col_id_t colId, bool isTag) {
2,770,867✔
1930
  int32_t code = 0;
2,770,867✔
1931
  SSdb   *pSdb = pMnode->pSdb;
2,770,867✔
1932
  void   *pIter = NULL;
2,770,867✔
1933
  while (1) {
×
1934
    SSmaObj *pSma = NULL;
2,770,867✔
1935
    pIter = sdbFetch(pSdb, SDB_SMA, pIter, (void **)&pSma);
2,770,867✔
1936
    if (pIter == NULL) break;
2,770,867✔
1937

1938
    mInfo("tsma:%s, check tag and column modifiable, stb:%s suid:%" PRId64 " colId:%d, sql:%s", pSma->name, stbFullName,
276✔
1939
          suid, colId, pSma->sql);
1940

1941
    if (isTag) {
276✔
1942
      code = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TSMA;
276✔
1943
      mError("tsma:%s, check tag:%d conflicted", pSma->name, colId);
276✔
1944
      sdbRelease(pSdb, pSma);
276✔
1945
      sdbCancelFetch(pSdb, pIter);
276✔
1946
      TAOS_RETURN(code);
276✔
1947
    }
1948

1949
    SNode *pAst = NULL;
×
1950
    if (nodesStringToNode(pSma->ast, &pAst) != 0) {
×
1951
      code = TSDB_CODE_SDB_INVALID_DATA_CONTENT;
×
1952
      mError("tsma:%s, check tag and column modifiable, stb:%s suid:%" PRId64 " colId:%d failed since parse AST err",
×
1953
             pSma->name, stbFullName, suid, colId);
1954
      sdbCancelFetch(pSdb, pIter);
×
1955
      TAOS_RETURN(code);
×
1956
    }
1957

1958
    SNodeList *pNodeList = NULL;
×
1959
    if ((code = nodesCollectColumns((SSelectStmt *)pAst, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pNodeList)) !=
×
1960
        0) {
1961
      sdbCancelFetch(pSdb, pIter);
×
1962
      TAOS_RETURN(code);
×
1963
    }
1964
    SNode *pNode = NULL;
×
1965
    FOREACH(pNode, pNodeList) {
×
1966
      SColumnNode *pCol = (SColumnNode *)pNode;
×
1967
      mInfo("tsma:%s, check colId:%d tableId:%" PRId64, pSma->name, pCol->colId, pCol->tableId);
×
1968

1969
      if ((pCol->tableId != suid) && (pSma->stbUid != suid)) {
×
1970
        mInfo("tsma:%s, check colId:%d passed", pSma->name, pCol->colId);
×
1971
        goto NEXT;
×
1972
      }
1973
      if ((pCol->colId) > 0 && (pCol->colId == colId)) {
×
1974
        code = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TSMA;
×
1975
        mError("tsma:%s, check colId:%d conflicted", pSma->name, pCol->colId);
×
1976
        nodesDestroyNode(pAst);
×
1977
        nodesDestroyList(pNodeList);
×
1978
        sdbRelease(pSdb, pSma);
×
1979
        sdbCancelFetch(pSdb, pIter);
×
1980
        TAOS_RETURN(code);
×
1981
      }
1982
      mInfo("tsma:%s, check colId:%d passed", pSma->name, pCol->colId);
×
1983
    }
1984

1985
  NEXT:
×
1986
    sdbRelease(pSdb, pSma);
×
1987
    nodesDestroyNode(pAst);
×
1988
    nodesDestroyList(pNodeList);
×
1989
  }
1990
  TAOS_RETURN(code);
2,770,591✔
1991
}
1992

1993
static int32_t mndDropSuperTableTag(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const char *tagName) {
111,535✔
1994
  int32_t code = 0;
111,535✔
1995
  int32_t tag = mndFindSuperTableTagIndex(pOld, tagName);
111,535✔
1996
  if (tag < 0) {
111,535✔
1997
    code = TSDB_CODE_MND_TAG_NOT_EXIST;
199✔
1998
    TAOS_RETURN(code);
199✔
1999
  }
2000

2001
  col_id_t colId = pOld->pTags[tag].colId;
111,336✔
2002
  TAOS_CHECK_RETURN(mndCheckAlterColForTSma(pMnode, pOld->name, pOld->uid, colId, true));
111,336✔
2003

2004
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
111,198✔
2005

2006
  memmove(pNew->pTags + tag, pNew->pTags + tag + 1, sizeof(SSchema) * (pNew->numOfTags - tag - 1));
111,198✔
2007
  pNew->numOfTags--;
111,198✔
2008

2009
  pNew->tagVer++;
111,198✔
2010

2011
  // if (mndDropIndexByTag(pMnode, pOld, tagName) != 0) {
2012
  //   return -1;
2013
  // }
2014
  mInfo("stb:%s, start to drop tag %s", pNew->name, tagName);
111,198✔
2015
  TAOS_RETURN(code);
111,198✔
2016
}
2017

2018
static int32_t mndAlterStbTagName(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, SArray *pFields) {
138,485✔
2019
  int32_t code = 0;
138,485✔
2020
  if ((int32_t)taosArrayGetSize(pFields) != 2) {
138,485✔
2021
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
2022
    TAOS_RETURN(code);
×
2023
  }
2024

2025
  SField *pField0 = taosArrayGet(pFields, 0);
138,485✔
2026
  SField *pField1 = taosArrayGet(pFields, 1);
138,485✔
2027

2028
  const char *oldTagName = pField0->name;
138,485✔
2029
  const char *newTagName = pField1->name;
138,485✔
2030

2031
  int32_t tag = mndFindSuperTableTagIndex(pOld, oldTagName);
138,485✔
2032
  if (tag < 0) {
138,485✔
2033
    code = TSDB_CODE_MND_TAG_NOT_EXIST;
3,842✔
2034
    TAOS_RETURN(code);
3,842✔
2035
  }
2036

2037
  col_id_t colId = pOld->pTags[tag].colId;
134,643✔
2038
  TAOS_CHECK_RETURN(mndCheckAlterColForTSma(pMnode, pOld->name, pOld->uid, colId, true));
134,643✔
2039

2040
  if (mndFindSuperTableTagIndex(pOld, newTagName) >= 0) {
134,505✔
2041
    code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
6,572✔
2042
    TAOS_RETURN(code);
6,572✔
2043
  }
2044

2045
  if (mndFindSuperTableColumnIndex(pOld, newTagName) >= 0) {
127,933✔
2046
    code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
199✔
2047
    TAOS_RETURN(code);
199✔
2048
  }
2049

2050
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
127,734✔
2051

2052
  SSchema *pSchema = (SSchema *)(pNew->pTags + tag);
127,734✔
2053
  memcpy(pSchema->name, newTagName, TSDB_COL_NAME_LEN);
127,734✔
2054

2055
  pNew->tagVer++;
127,734✔
2056
  mInfo("stb:%s, start to modify tag %s to %s", pNew->name, oldTagName, newTagName);
127,734✔
2057
  TAOS_RETURN(code);
127,734✔
2058
}
2059

2060
static int32_t mndAlterStbTagBytes(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const SField *pField) {
329,006✔
2061
  int32_t code = 0;
329,006✔
2062
  int32_t tag = mndFindSuperTableTagIndex(pOld, pField->name);
329,006✔
2063
  if (tag < 0) {
329,006✔
2064
    code = TSDB_CODE_MND_TAG_NOT_EXIST;
199✔
2065
    TAOS_RETURN(code);
199✔
2066
  }
2067

2068
  col_id_t colId = pOld->pTags[tag].colId;
328,807✔
2069
  TAOS_CHECK_RETURN(mndCheckAlterColForTSma(pMnode, pOld->name, pOld->uid, colId, true));
328,807✔
2070

2071
  uint32_t nLen = 0;
328,807✔
2072
  for (int32_t i = 0; i < pOld->numOfTags; ++i) {
13,111,951✔
2073
    nLen += (pOld->pTags[i].colId == colId) ? pField->bytes : pOld->pTags[i].bytes;
12,783,144✔
2074
  }
2075

2076
  if (nLen > TSDB_MAX_TAGS_LEN) {
328,807✔
2077
    code = TSDB_CODE_PAR_INVALID_TAGS_LENGTH;
194,940✔
2078
    TAOS_RETURN(code);
194,940✔
2079
  }
2080

2081
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
133,867✔
2082

2083
  SSchema *pTag = pNew->pTags + tag;
133,867✔
2084

2085
  if (!(pTag->type == TSDB_DATA_TYPE_BINARY || pTag->type == TSDB_DATA_TYPE_VARBINARY ||
133,867✔
2086
        pTag->type == TSDB_DATA_TYPE_NCHAR || pTag->type == TSDB_DATA_TYPE_GEOMETRY)) {
127,563✔
2087
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
199✔
2088
    TAOS_RETURN(code);
199✔
2089
  }
2090

2091
  if (pField->bytes <= pTag->bytes) {
133,668✔
2092
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
37,819✔
2093
    TAOS_RETURN(code);
37,819✔
2094
  }
2095

2096
  pTag->bytes = pField->bytes;
95,849✔
2097
  pNew->tagVer++;
95,849✔
2098

2099
  mInfo("stb:%s, start to modify tag len %s to %d", pNew->name, pField->name, pField->bytes);
95,849✔
2100
  TAOS_RETURN(code);
95,849✔
2101
}
2102

2103
static int32_t mndUpdateSuperTableColumnCompress(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, SArray *pField,
96,495✔
2104
                                                 int32_t nCols) {
2105
  // if (pColCmpr == NULL || colName == NULL) return -1;
2106

2107
  if (taosArrayGetSize(pField) != nCols) return TSDB_CODE_FAILED;
96,495✔
2108
  TAOS_FIELD *p = taosArrayGet(pField, 0);
96,495✔
2109

2110
  int32_t code = 0;
96,495✔
2111
  int32_t idx = mndFindSuperTableColumnIndex(pOld, p->name);
96,495✔
2112
  if (idx == -1) {
96,495✔
2113
    code = TSDB_CODE_MND_COLUMN_NOT_EXIST;
×
2114
    TAOS_RETURN(code);
×
2115
  }
2116
  SSchema *pTarget = &pOld->pColumns[idx];
96,495✔
2117
  col_id_t colId = pTarget->colId;
96,495✔
2118

2119
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
96,495✔
2120
  code = validColCmprByType(pTarget->type, p->bytes);
96,495✔
2121
  if (code != TSDB_CODE_SUCCESS) {
96,495✔
2122
    TAOS_RETURN(code);
2,318✔
2123
  }
2124

2125
  int8_t updated = 0;
94,177✔
2126
  for (int i = 0; i < pNew->numOfColumns; i++) {
797,559✔
2127
    SColCmpr *pCmpr = &pNew->pCmpr[i];
797,559✔
2128
    if (pCmpr->id == colId) {
797,559✔
2129
      uint32_t dst = 0;
94,177✔
2130
      updated = tUpdateCompress(pCmpr->alg, p->bytes, TSDB_COLVAL_COMPRESS_DISABLED, TSDB_COLVAL_LEVEL_DISABLED,
94,177✔
2131
                                TSDB_COLVAL_LEVEL_MEDIUM, &dst);
2132
      if (updated > 0) pCmpr->alg = dst;
94,177✔
2133
      break;
94,177✔
2134
    }
2135
  }
2136

2137
  if (updated == 0) {
94,177✔
2138
    code = TSDB_CODE_MND_COLUMN_COMPRESS_ALREADY_EXIST;
8,260✔
2139
    TAOS_RETURN(code);
8,260✔
2140
  } else if (updated == -1) {
85,917✔
2141
    code = TSDB_CODE_TSC_COMPRESS_LEVEL_ERROR;
×
2142
    TAOS_RETURN(code);
×
2143
  }
2144

2145
  pNew->colVer++;
85,917✔
2146

2147
  TAOS_RETURN(code);
85,917✔
2148
}
2149
static int32_t mndAddSuperTableColumn(const SStbObj *pOld, SStbObj *pNew, const SMAlterStbReq* pReq, int32_t ncols,
2,741,340✔
2150
                                      int8_t withCompress) {
2151
  int32_t code = 0;
2,741,340✔
2152
  int32_t maxColumns = pOld->virtualStb ? TSDB_MAX_COLUMNS : TSDB_MAX_COLUMNS_NON_VIRTUAL;
2,741,340✔
2153
  int32_t maxBytesPerRow = pOld->virtualStb ? TSDB_MAX_BYTES_PER_ROW_VIRTUAL : TSDB_MAX_BYTES_PER_ROW;
2,741,340✔
2154
  if (pOld->numOfColumns + ncols + pOld->numOfTags > maxColumns) {
2,741,340✔
2155
    code = TSDB_CODE_MND_TOO_MANY_COLUMNS;
×
2156
    TAOS_RETURN(code);
×
2157
  }
2158

2159
  if ((code = grantCheck(TSDB_GRANT_TIMESERIES)) != 0) {
2,741,340✔
2160
    TAOS_RETURN(code);
×
2161
  }
2162

2163
  if (!mndValidateSchema(pOld->pColumns, pOld->numOfColumns, pReq->pFields, maxBytesPerRow)) {
2,741,340✔
2164
    code = TSDB_CODE_PAR_INVALID_ROW_LENGTH;
2,736✔
2165
    TAOS_RETURN(code);
2,736✔
2166
  }
2167

2168
  pNew->numOfColumns = pNew->numOfColumns + ncols;
2,738,604✔
2169

2170
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
2,738,604✔
2171

2172
  if (pNew->nextColId < 0 || pNew->nextColId >= 0x7fff - ncols) {
2,738,604✔
2173
    code = TSDB_CODE_OUT_OF_RANGE;
1,178✔
2174
    TAOS_RETURN(code);
1,178✔
2175
  }
2176

2177
  for (int32_t i = 0; i < ncols; i++) {
5,168,555✔
2178
    if (withCompress) {
2,737,426✔
2179
      SFieldWithOptions *pField = taosArrayGet(pReq->pFields, i);
264,484✔
2180
      if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
264,484✔
2181
        code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
×
2182
        TAOS_RETURN(code);
×
2183
      }
2184

2185
      if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
264,484✔
2186
        code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
×
2187
        TAOS_RETURN(code);
×
2188
      }
2189

2190
      SSchema *pSchema = &pNew->pColumns[pOld->numOfColumns + i];
264,484✔
2191
      pSchema->bytes = pField->bytes;
264,484✔
2192
      pSchema->type = pField->type;
264,484✔
2193
      memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
264,484✔
2194
      if (pNew->nextColId > INT16_MAX) {
264,484✔
2195
        code = TSDB_CODE_MND_EXCEED_MAX_COL_ID;
×
2196
        TAOS_RETURN(code);
×
2197
      }
2198
      pSchema->colId = pNew->nextColId;
264,484✔
2199
      pNew->nextColId++;
264,484✔
2200

2201
      SColCmpr *pCmpr = &pNew->pCmpr[pOld->numOfColumns + i];
264,484✔
2202
      pCmpr->id = pSchema->colId;
264,484✔
2203
      pCmpr->alg = pField->compress;
264,484✔
2204
      mInfo("stb:%s, start to add column %s", pNew->name, pSchema->name);
264,484✔
2205
    } else {
2206
      SField *pField = taosArrayGet(pReq->pFields, i);
2,472,942✔
2207
      if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
2,472,942✔
2208
        code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
304,028✔
2209
        TAOS_RETURN(code);
304,028✔
2210
      }
2211

2212
      if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
2,168,914✔
2213
        code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
2,269✔
2214
        TAOS_RETURN(code);
2,269✔
2215
      }
2216

2217
      SSchema *pSchema = &pNew->pColumns[pOld->numOfColumns + i];
2,166,645✔
2218
      pSchema->bytes = pField->bytes;
2,166,645✔
2219
      pSchema->type = pField->type;
2,166,645✔
2220
      memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
2,166,645✔
2221
      if (pNew->nextColId > INT16_MAX) {
2,166,645✔
2222
        code = TSDB_CODE_MND_EXCEED_MAX_COL_ID;
×
2223
        TAOS_RETURN(code);
×
2224
      }
2225
      pSchema->colId = pNew->nextColId;
2,166,645✔
2226
      pNew->nextColId++;
2,166,645✔
2227

2228
      SColCmpr *pCmpr = &pNew->pCmpr[pOld->numOfColumns + i];
2,166,645✔
2229
      pCmpr->id = pSchema->colId;
2,166,645✔
2230
      pCmpr->alg = createDefaultColCmprByType(pSchema->type);
2,166,645✔
2231
      mInfo("stb:%s, start to add column %s", pNew->name, pSchema->name);
2,166,645✔
2232
    }
2233
  }
2234
  // 1. old schema already has extschemas
2235
  // 2. new schema has extschemas
2236
  if (pReq->pTypeMods || pOld->pExtSchemas) {
2,431,129✔
2237
    if (!pNew->pExtSchemas) {
2,430,731✔
2238
      // all ext schemas reset to zero
2239
      pNew->pExtSchemas = taosMemoryCalloc(pNew->numOfColumns, sizeof(SExtSchema));
34,543✔
2240
      if (!pNew->pExtSchemas) TAOS_RETURN(terrno);
34,543✔
2241
    }
2242
    if (pOld->pExtSchemas) {
2,430,731✔
2243
      memcpy(pNew->pExtSchemas, pOld->pExtSchemas, pOld->numOfColumns * sizeof(SExtSchema));
2,396,188✔
2244
    }
2245
    if (taosArrayGetSize(pReq->pTypeMods) > 0) {
2,430,731✔
2246
      // copy added column ext schema
2247
      for (int32_t i = 0; i < ncols; ++i) {
4,861,462✔
2248
        pNew->pColumns[pOld->numOfColumns + i].flags |= COL_HAS_TYPE_MOD;
2,430,731✔
2249
        pNew->pExtSchemas[pOld->numOfColumns + i].typeMod = *(STypeMod *)taosArrayGet(pReq->pTypeMods, i);
2,430,731✔
2250
      }
2251
    }
2252
  }
2253

2254
  pNew->colVer++;
2,431,129✔
2255
  TAOS_RETURN(code);
2,431,129✔
2256
}
2257

2258
static int32_t mndDropSuperTableColumn(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const char *colName) {
1,704,864✔
2259
  int32_t code = 0;
1,704,864✔
2260
  int32_t col = mndFindSuperTableColumnIndex(pOld, colName);
1,704,864✔
2261
  if (col < 0) {
1,704,864✔
2262
    code = TSDB_CODE_MND_COLUMN_NOT_EXIST;
2,269✔
2263
    TAOS_RETURN(code);
2,269✔
2264
  }
2265

2266
  if (col == 0) {
1,702,595✔
2267
    code = TSDB_CODE_MND_INVALID_STB_ALTER_OPTION;
1,670✔
2268
    TAOS_RETURN(code);
1,670✔
2269
  }
2270

2271
  if (pOld->numOfColumns == 2) {
1,700,925✔
2272
    code = TSDB_CODE_PAR_INVALID_DROP_COL;
199✔
2273
    TAOS_RETURN(code);
199✔
2274
  }
2275

2276
  col_id_t colId = pOld->pColumns[col].colId;
1,700,726✔
2277
  TAOS_CHECK_RETURN(mndCheckAlterColForTSma(pMnode, pOld->name, pOld->uid, colId, false));
1,700,726✔
2278

2279
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
1,700,726✔
2280

2281
  int32_t sz = pNew->numOfColumns - col - 1;
1,700,726✔
2282
  memmove(pNew->pColumns + col, pNew->pColumns + col + 1, sizeof(SSchema) * sz);
1,700,726✔
2283
  memmove(pNew->pCmpr + col, pNew->pCmpr + col + 1, sizeof(SColCmpr) * sz);
1,700,726✔
2284
  if (pOld->pExtSchemas) {
1,700,726✔
2285
    memmove(pNew->pExtSchemas + col, pNew->pExtSchemas + col + 1, sizeof(SExtSchema) * sz);
1,670,457✔
2286
  }
2287
  pNew->numOfColumns--;
1,700,726✔
2288

2289
  pNew->colVer++;
1,700,726✔
2290
  mInfo("stb:%s, start to drop col %s", pNew->name, colName);
1,700,726✔
2291
  TAOS_RETURN(code);
1,700,726✔
2292
}
2293

2294
static int32_t mndAlterStbColumnBytes(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const SField *pField) {
522,628✔
2295
  int32_t code = 0;
522,628✔
2296
  int32_t col = mndFindSuperTableColumnIndex(pOld, pField->name);
522,628✔
2297
  if (col < 0) {
522,628✔
2298
    code = TSDB_CODE_MND_COLUMN_NOT_EXIST;
398✔
2299
    TAOS_RETURN(code);
398✔
2300
  }
2301

2302
  col_id_t colId = pOld->pColumns[col].colId;
522,230✔
2303

2304
  uint32_t nLen = 0;
522,230✔
2305
  int32_t  maxBytesPerRow = pOld->virtualStb ? TSDB_MAX_BYTES_PER_ROW_VIRTUAL : TSDB_MAX_BYTES_PER_ROW;
522,230✔
2306
  for (int32_t i = 0; i < pOld->numOfColumns; ++i) {
40,562,795✔
2307
    nLen += (pOld->pColumns[i].colId == colId) ? pField->bytes : pOld->pColumns[i].bytes;
40,040,565✔
2308
  }
2309

2310
  if (nLen > maxBytesPerRow) {
522,230✔
2311
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
26,875✔
2312
    TAOS_RETURN(code);
26,875✔
2313
  }
2314

2315
  TAOS_CHECK_RETURN(mndCheckAlterColForTSma(pMnode, pOld->name, pOld->uid, colId, false));
495,355✔
2316

2317
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
495,355✔
2318

2319
  SSchema *pCol = pNew->pColumns + col;
495,355✔
2320
  if (!(pCol->type == TSDB_DATA_TYPE_BINARY || pCol->type == TSDB_DATA_TYPE_VARBINARY ||
495,355✔
2321
        pCol->type == TSDB_DATA_TYPE_NCHAR || pCol->type == TSDB_DATA_TYPE_GEOMETRY)) {
482,463✔
2322
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
199✔
2323
    TAOS_RETURN(code);
199✔
2324
  }
2325

2326
  if (pField->bytes <= pCol->bytes) {
495,156✔
2327
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
197,191✔
2328
    TAOS_RETURN(code);
197,191✔
2329
  }
2330

2331
  pCol->bytes = pField->bytes;
297,965✔
2332
  pNew->colVer++;
297,965✔
2333

2334
  mInfo("stb:%s, start to modify col len %s to %d", pNew->name, pField->name, pField->bytes);
297,965✔
2335
  TAOS_RETURN(code);
297,965✔
2336
}
2337

2338
static int32_t mndSetAlterStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
4,978,252✔
2339
  int32_t  code = 0;
4,978,252✔
2340
  SSdbRaw *pRedoRaw = mndStbActionEncode(pStb);
4,978,252✔
2341
  if (pRedoRaw == NULL) {
4,978,252✔
2342
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2343
    if (terrno != 0) code = terrno;
×
2344
    TAOS_RETURN(code);
×
2345
  }
2346
  if ((code = mndTransAppendPrepareLog(pTrans, pRedoRaw)) != 0) {
4,978,252✔
2347
    sdbFreeRaw(pRedoRaw);
×
2348
    TAOS_RETURN(code);
×
2349
  }
2350
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY));
4,978,252✔
2351

2352
  TAOS_RETURN(code);
4,978,252✔
2353
}
2354

2355
static int32_t mndSetAlterStbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
4,978,252✔
2356
  int32_t  code = 0;
4,978,252✔
2357
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
4,978,252✔
2358
  if (pCommitRaw == NULL) {
4,978,252✔
2359
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2360
    if (terrno != 0) code = terrno;
×
2361
    TAOS_RETURN(code);
×
2362
  }
2363
  if ((code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
4,978,252✔
2364
    sdbFreeRaw(pCommitRaw);
×
2365
    TAOS_RETURN(code);
×
2366
  }
2367
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
4,978,252✔
2368

2369
  TAOS_RETURN(code);
4,978,252✔
2370
}
2371

2372
static int32_t mndSetAlterStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb, void *alterOriData,
4,978,252✔
2373
                                         int32_t alterOriDataLen) {
2374
  int32_t code = 0;
4,978,252✔
2375
  SSdb   *pSdb = pMnode->pSdb;
4,978,252✔
2376
  SVgObj *pVgroup = NULL;
4,978,252✔
2377
  void   *pIter = NULL;
4,978,252✔
2378
  int32_t contLen;
4,976,204✔
2379

2380
  while (1) {
12,903,341✔
2381
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
17,881,593✔
2382
    if (pIter == NULL) break;
17,881,593✔
2383
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
12,903,341✔
2384
      sdbRelease(pSdb, pVgroup);
5,937,233✔
2385
      continue;
5,937,233✔
2386
    }
2387

2388
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, alterOriData, alterOriDataLen);
6,966,108✔
2389
    if (pReq == NULL) {
6,966,108✔
2390
      sdbCancelFetch(pSdb, pIter);
×
2391
      sdbRelease(pSdb, pVgroup);
×
2392
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2393
      if (terrno != 0) code = terrno;
×
2394
      TAOS_RETURN(code);
×
2395
    }
2396
    STransAction action = {0};
6,966,108✔
2397
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
6,966,108✔
2398
    action.pCont = pReq;
6,966,108✔
2399
    action.contLen = contLen;
6,966,108✔
2400
    action.msgType = TDMT_VND_ALTER_STB;
6,966,108✔
2401
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
6,966,108✔
2402
      taosMemoryFree(pReq);
×
2403
      sdbCancelFetch(pSdb, pIter);
×
2404
      sdbRelease(pSdb, pVgroup);
×
2405
      TAOS_RETURN(code);
×
2406
    }
2407
    sdbRelease(pSdb, pVgroup);
6,966,108✔
2408
  }
2409

2410
  TAOS_RETURN(code);
4,978,252✔
2411
}
2412

2413
static int32_t mndSetAlterStbRedoActions2(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb,
×
2414
                                          void *alterOriData, int32_t alterOriDataLen) {
2415
  int32_t code = 0;
×
2416
  SSdb   *pSdb = pMnode->pSdb;
×
2417
  SVgObj *pVgroup = NULL;
×
2418
  void   *pIter = NULL;
×
2419
  int32_t contLen;
×
2420

2421
  while (1) {
×
2422
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
×
2423
    if (pIter == NULL) break;
×
2424
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
×
2425
      sdbRelease(pSdb, pVgroup);
×
2426
      continue;
×
2427
    }
2428

2429
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, alterOriData, alterOriDataLen);
×
2430
    if (pReq == NULL) {
×
2431
      sdbCancelFetch(pSdb, pIter);
×
2432
      sdbRelease(pSdb, pVgroup);
×
2433
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2434
      if (terrno != 0) code = terrno;
×
2435
      TAOS_RETURN(code);
×
2436
    }
2437
    STransAction action = {0};
×
2438
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
×
2439
    action.pCont = pReq;
×
2440
    action.contLen = contLen;
×
2441
    action.msgType = TDMT_VND_CREATE_INDEX;
×
2442
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
×
2443
      taosMemoryFree(pReq);
×
2444
      sdbCancelFetch(pSdb, pIter);
×
2445
      sdbRelease(pSdb, pVgroup);
×
2446
      TAOS_RETURN(code);
×
2447
    }
2448
    sdbRelease(pSdb, pVgroup);
×
2449
  }
2450

2451
  TAOS_RETURN(code);
×
2452
}
2453

2454
static int32_t mndBuildStbSchemaImp(SMnode *pMnode, SDbObj *pDb, SStbObj *pStb, const char *tbName, STableMetaRsp *pRsp, bool refByStm) {
23,358,674✔
2455
  int32_t code = 0;
23,358,674✔
2456
  taosRLockLatch(&pStb->lock);
23,358,674✔
2457

2458
  int32_t totalCols = pStb->numOfColumns + pStb->numOfTags;
23,358,674✔
2459
  pRsp->pSchemas = taosMemoryCalloc(totalCols, sizeof(SSchema));
23,358,674✔
2460
  if (pRsp->pSchemas == NULL) {
23,358,674✔
2461
    taosRUnLockLatch(&pStb->lock);
×
2462
    code = terrno;
×
2463
    TAOS_RETURN(code);
×
2464
  }
2465
  pRsp->pSchemaExt = taosMemoryCalloc(pStb->numOfColumns, sizeof(SSchemaExt));
23,358,674✔
2466
  if (pRsp->pSchemaExt == NULL) {
23,358,674✔
2467
    taosRUnLockLatch(&pStb->lock);
×
2468
    code = terrno;
×
2469
    TAOS_RETURN(code);
×
2470
  }
2471
  pRsp->numOfColRefs = 0;
23,358,674✔
2472
  pRsp->pColRefs = NULL;
23,358,674✔
2473
  tstrncpy(pRsp->dbFName, pStb->db, sizeof(pRsp->dbFName));
23,358,674✔
2474
  tstrncpy(pRsp->tbName, tbName, sizeof(pRsp->tbName));
23,358,674✔
2475
  tstrncpy(pRsp->stbName, tbName, sizeof(pRsp->stbName));
23,358,674✔
2476
  pRsp->dbId = pDb->uid;
23,358,674✔
2477
  pRsp->numOfTags = pStb->numOfTags;
23,358,674✔
2478
  pRsp->numOfColumns = pStb->numOfColumns;
23,358,674✔
2479
  pRsp->precision = pDb->cfg.precision;
23,358,674✔
2480
  pRsp->tableType = TSDB_SUPER_TABLE;
23,358,674✔
2481
  pRsp->sversion = pStb->colVer;
23,358,674✔
2482
  pRsp->tversion = pStb->tagVer;
23,358,674✔
2483
  pRsp->suid = pStb->uid;
23,358,674✔
2484
  pRsp->tuid = pStb->uid;
23,358,674✔
2485
  pRsp->virtualStb = pStb->virtualStb;
23,358,674✔
2486
  pRsp->ownerId = pStb->ownerId;
23,358,674✔
2487
  pRsp->isAudit = pDb->cfg.isAudit ? 1 : 0;
23,358,674✔
2488
  pRsp->secureDelete = pStb->secureDelete;
23,358,674✔
2489

2490
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
645,278,310✔
2491
    SSchema *pSchema = &pRsp->pSchemas[i];
621,919,636✔
2492
    SSchema *pSrcSchema = &pStb->pColumns[i];
621,919,636✔
2493
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
621,919,636✔
2494
    pSchema->type = pSrcSchema->type;
621,919,636✔
2495
    pSchema->flags = pSrcSchema->flags;
621,919,636✔
2496
    pSchema->colId = pSrcSchema->colId;
621,919,636✔
2497
    pSchema->bytes = pSrcSchema->bytes;
621,919,636✔
2498
  }
2499
  
2500
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
114,357,737✔
2501
    SSchema *pSchema = &pRsp->pSchemas[i + pStb->numOfColumns];
90,999,063✔
2502
    SSchema *pSrcSchema = &pStb->pTags[i];
90,999,063✔
2503
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
90,999,063✔
2504
    pSchema->type = pSrcSchema->type;
90,999,063✔
2505
    pSchema->flags = pSrcSchema->flags;
90,999,063✔
2506
    pSchema->colId = pSrcSchema->colId;
90,999,063✔
2507
    pSchema->bytes = pSrcSchema->bytes;
90,999,063✔
2508
  }
2509

2510
  if (refByStm) {
23,358,674✔
2511
    mndStreamUpdateTagsRefFlag(pMnode, pStb->uid, &pRsp->pSchemas[pStb->numOfColumns], pStb->numOfTags);
16,392,606✔
2512
  }
2513

2514
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
645,277,514✔
2515
    SColCmpr   *pCmpr = &pStb->pCmpr[i];
621,919,238✔
2516
    SSchemaExt *pSchEx = &pRsp->pSchemaExt[i];
621,918,840✔
2517
    pSchEx->colId = pCmpr->id;
621,919,221✔
2518
    pSchEx->compress = pCmpr->alg;
621,918,823✔
2519
    if (pStb->pExtSchemas) {
621,918,823✔
2520
      pSchEx->typeMod = pStb->pExtSchemas[i].typeMod;
304,346,665✔
2521
    }
2522
  }
2523

2524
  taosRUnLockLatch(&pStb->lock);
23,358,674✔
2525
  TAOS_RETURN(code);
23,358,674✔
2526
}
2527

2528
static int32_t mndBuildStbCfgImp(SDbObj *pDb, SStbObj *pStb, const char *tbName, STableCfgRsp *pRsp) {
29,865✔
2529
  int32_t code = 0;
29,865✔
2530
  taosRLockLatch(&pStb->lock);
29,865✔
2531

2532
  int32_t totalCols = pStb->numOfColumns + pStb->numOfTags;
29,865✔
2533
  pRsp->pSchemas = taosMemoryCalloc(totalCols, sizeof(SSchema));
29,865✔
2534
  if (pRsp->pSchemas == NULL) {
29,865✔
2535
    taosRUnLockLatch(&pStb->lock);
×
2536
    code = terrno;
×
2537
    TAOS_RETURN(code);
×
2538
  }
2539

2540
  tstrncpy(pRsp->dbFName, pStb->db, sizeof(pRsp->dbFName));
29,865✔
2541
  tstrncpy(pRsp->tbName, tbName, sizeof(pRsp->tbName));
29,865✔
2542
  tstrncpy(pRsp->stbName, tbName, sizeof(pRsp->stbName));
29,865✔
2543
  pRsp->numOfTags = pStb->numOfTags;
29,865✔
2544
  pRsp->numOfColumns = pStb->numOfColumns;
29,865✔
2545
  pRsp->tableType = TSDB_SUPER_TABLE;
29,865✔
2546
  pRsp->delay1 = pStb->maxdelay[0];
29,865✔
2547
  pRsp->delay2 = pStb->maxdelay[1];
29,865✔
2548
  pRsp->watermark1 = pStb->watermark[0];
29,865✔
2549
  pRsp->watermark2 = pStb->watermark[1];
29,865✔
2550
  pRsp->ttl = pStb->ttl;
29,865✔
2551
  pRsp->keep = pStb->keep;
29,865✔
2552
  pRsp->commentLen = pStb->commentLen;
29,865✔
2553
  if (pStb->commentLen > 0) {
29,865✔
2554
    pRsp->pComment = taosStrdup(pStb->comment);
×
2555
  }
2556

2557
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
165,319✔
2558
    SSchema *pSchema = &pRsp->pSchemas[i];
135,454✔
2559
    SSchema *pSrcSchema = &pStb->pColumns[i];
135,454✔
2560
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
135,454✔
2561
    pSchema->type = pSrcSchema->type;
135,454✔
2562
    pSchema->flags = pSrcSchema->flags;
135,454✔
2563
    pSchema->colId = pSrcSchema->colId;
135,454✔
2564
    pSchema->bytes = pSrcSchema->bytes;
135,454✔
2565
  }
2566

2567
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
82,770✔
2568
    SSchema *pSchema = &pRsp->pSchemas[i + pStb->numOfColumns];
52,905✔
2569
    SSchema *pSrcSchema = &pStb->pTags[i];
52,905✔
2570
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
52,905✔
2571
    pSchema->type = pSrcSchema->type;
52,905✔
2572
    pSchema->flags = pSrcSchema->flags;
52,905✔
2573
    pSchema->colId = pSrcSchema->colId;
52,905✔
2574
    pSchema->bytes = pSrcSchema->bytes;
52,905✔
2575
  }
2576

2577
  if (pStb->numOfFuncs > 0) {
29,865✔
2578
    pRsp->pFuncs = taosArrayDup(pStb->pFuncs, NULL);
×
2579
  }
2580

2581
  pRsp->pSchemaExt = taosMemoryCalloc(pStb->numOfColumns, sizeof(SSchemaExt));
29,865✔
2582
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
165,319✔
2583
    SColCmpr *pCmpr = &pStb->pCmpr[i];
135,454✔
2584

2585
    SSchemaExt *pSchExt = &pRsp->pSchemaExt[i];
135,454✔
2586
    pSchExt->colId = pCmpr->id;
135,454✔
2587
    pSchExt->compress = pCmpr->alg;
135,454✔
2588
    if (pStb->pExtSchemas) {
135,454✔
2589
      pSchExt->typeMod = pStb->pExtSchemas[i].typeMod;
38,960✔
2590
    }
2591
  }
2592
  pRsp->virtualStb = pStb->virtualStb;
29,865✔
2593
  pRsp->pColRefs = NULL;
29,865✔
2594
  pRsp->secureDelete = pStb->secureDelete;
29,865✔
2595

2596
  taosRUnLockLatch(&pStb->lock);
29,865✔
2597
  TAOS_RETURN(code);
29,865✔
2598
}
2599

2600
static int32_t mndValidateStbVersion(SMnode *pMnode, SSTableVersion *pStbVer, bool *schema, bool *sma) {
8,954,715✔
2601
  int32_t code = 0;
8,954,715✔
2602
  char    tbFName[TSDB_TABLE_FNAME_LEN] = {0};
8,954,715✔
2603
  snprintf(tbFName, sizeof(tbFName), "%s.%s", pStbVer->dbFName, pStbVer->stbName);
8,954,715✔
2604

2605
  SDbObj *pDb = mndAcquireDb(pMnode, pStbVer->dbFName);
8,954,715✔
2606
  if (pDb == NULL) {
8,954,715✔
2607
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
29,782✔
2608
    TAOS_RETURN(code);
29,782✔
2609
  }
2610

2611
  if (pDb->uid != pStbVer->dbId) {
8,924,933✔
2612
    mndReleaseDb(pMnode, pDb);
10,681✔
2613
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
10,681✔
2614
    TAOS_RETURN(code);
10,681✔
2615
  }
2616

2617
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
8,914,252✔
2618
  if (pStb == NULL) {
8,914,252✔
2619
    mndReleaseDb(pMnode, pDb);
1,794✔
2620
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
1,794✔
2621
    TAOS_RETURN(code);
1,794✔
2622
  }
2623

2624
  taosRLockLatch(&pStb->lock);
8,912,458✔
2625

2626
  if (pStbVer->sversion != pStb->colVer || pStbVer->tversion != pStb->tagVer) {
8,912,458✔
2627
    *schema = true;
19,732✔
2628
  } else {
2629
    *schema = false;
8,892,726✔
2630
  }
2631

2632
  if (pStbVer->smaVer && pStbVer->smaVer != pStb->smaVer) {
8,912,458✔
2633
    *sma = true;
×
2634
  } else {
2635
    *sma = false;
8,912,458✔
2636
  }
2637

2638
  taosRUnLockLatch(&pStb->lock);
8,912,458✔
2639

2640
  mndReleaseDb(pMnode, pDb);
8,912,458✔
2641
  mndReleaseStb(pMnode, pStb);
8,912,458✔
2642
  return TSDB_CODE_SUCCESS;
8,912,458✔
2643
}
2644

2645
static int32_t mndBuildStbSchema(SMnode *pMnode, const char *dbFName, const char *tbName, STableMetaRsp *pRsp, bool refByStm) {
17,167,734✔
2646
  int32_t code = 0;
17,167,734✔
2647
  char    tbFName[TSDB_TABLE_FNAME_LEN] = {0};
17,167,734✔
2648
  snprintf(tbFName, sizeof(tbFName), "%s.%s", dbFName, tbName);
17,167,734✔
2649

2650
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
17,167,734✔
2651
  if (pDb == NULL) {
17,167,734✔
2652
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
2653
    TAOS_RETURN(code);
×
2654
  }
2655

2656
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
17,167,734✔
2657
  if (pStb == NULL) {
17,167,734✔
2658
    mndReleaseDb(pMnode, pDb);
755,396✔
2659
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
755,396✔
2660
    TAOS_RETURN(code);
755,396✔
2661
  }
2662

2663
  code = mndBuildStbSchemaImp(pMnode, pDb, pStb, tbName, pRsp, refByStm);
16,412,338✔
2664
  mndReleaseDb(pMnode, pDb);
16,412,338✔
2665
  mndReleaseStb(pMnode, pStb);
16,412,338✔
2666
  TAOS_RETURN(code);
16,412,338✔
2667
}
2668

2669
static int32_t mndBuildStbCfg(SMnode *pMnode, const char *dbFName, const char *tbName, STableCfgRsp *pRsp) {
29,865✔
2670
  int32_t code = 0;
29,865✔
2671
  char    tbFName[TSDB_TABLE_FNAME_LEN] = {0};
29,865✔
2672
  snprintf(tbFName, sizeof(tbFName), "%s.%s", dbFName, tbName);
29,865✔
2673

2674
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
29,865✔
2675
  if (pDb == NULL) {
29,865✔
2676
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
2677
    TAOS_RETURN(code);
×
2678
  }
2679

2680
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
29,865✔
2681
  if (pStb == NULL) {
29,865✔
2682
    mndReleaseDb(pMnode, pDb);
×
2683
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
×
2684
    TAOS_RETURN(code);
×
2685
  }
2686

2687
  code = mndBuildStbCfgImp(pDb, pStb, tbName, pRsp);
29,865✔
2688

2689
  mndReleaseDb(pMnode, pDb);
29,865✔
2690
  mndReleaseStb(pMnode, pStb);
29,865✔
2691
  TAOS_RETURN(code);
29,865✔
2692
}
2693

2694
static int32_t mndBuildSMAlterStbRsp(SDbObj *pDb, SStbObj *pObj, void **pCont, int32_t *pLen) {
4,917,487✔
2695
  int32_t       code = 0;
4,917,487✔
2696
  SEncoder      ec = {0};
4,917,487✔
2697
  uint32_t      contLen = 0;
4,917,487✔
2698
  SMAlterStbRsp alterRsp = {0};
4,917,487✔
2699
  SName         name = {0};
4,917,487✔
2700
  TAOS_CHECK_RETURN(tNameFromString(&name, pObj->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
4,917,487✔
2701

2702
  alterRsp.pMeta = taosMemoryCalloc(1, sizeof(STableMetaRsp));
4,917,487✔
2703
  if (NULL == alterRsp.pMeta) {
4,917,487✔
2704
    code = terrno;
×
2705
    TAOS_RETURN(code);
×
2706
  }
2707

2708
  code = mndBuildStbSchemaImp(NULL, pDb, pObj, name.tname, alterRsp.pMeta, false);
4,917,487✔
2709
  if (code) {
4,917,487✔
2710
    tFreeSMAlterStbRsp(&alterRsp);
×
2711
    return code;
×
2712
  }
2713

2714
  tEncodeSize(tEncodeSMAlterStbRsp, &alterRsp, contLen, code);
4,917,487✔
2715
  if (code) {
4,917,487✔
2716
    tFreeSMAlterStbRsp(&alterRsp);
×
2717
    return code;
×
2718
  }
2719

2720
  void *cont = taosMemoryMalloc(contLen);
4,917,487✔
2721
  if (NULL == cont) {
4,917,487✔
2722
    code = terrno;
×
2723
    tFreeSMAlterStbRsp(&alterRsp);
×
2724
    TAOS_RETURN(code);
×
2725
  }
2726
  tEncoderInit(&ec, cont, contLen);
4,917,487✔
2727
  code = tEncodeSMAlterStbRsp(&ec, &alterRsp);
4,917,487✔
2728
  tEncoderClear(&ec);
4,917,487✔
2729

2730
  tFreeSMAlterStbRsp(&alterRsp);
4,917,487✔
2731

2732
  if (code < 0) TAOS_RETURN(code);
4,917,487✔
2733

2734
  *pCont = cont;
4,917,487✔
2735
  *pLen = contLen;
4,917,487✔
2736

2737
  TAOS_RETURN(code);
4,917,487✔
2738
}
2739

2740
int32_t mndBuildSMCreateStbRsp(SMnode *pMnode, char *dbFName, char *stbFName, void **pCont, int32_t *pLen) {
2,030,419✔
2741
  int32_t code = -1;
2,030,419✔
2742
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
2,030,419✔
2743
  if (NULL == pDb) {
2,030,419✔
2744
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2745
    if (terrno != 0) code = terrno;
×
2746
    TAOS_RETURN(code);
×
2747
  }
2748

2749
  SStbObj *pObj = mndAcquireStb(pMnode, stbFName);
2,030,419✔
2750
  if (NULL == pObj) {
2,030,419✔
2751
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
1,570✔
2752
    if (terrno != 0) code = terrno;
1,570✔
2753
    goto _OVER;
1,570✔
2754
  }
2755

2756
  SEncoder       ec = {0};
2,028,849✔
2757
  uint32_t       contLen = 0;
2,028,849✔
2758
  SMCreateStbRsp stbRsp = {0};
2,028,849✔
2759
  SName          name = {0};
2,028,849✔
2760
  TAOS_CHECK_GOTO(tNameFromString(&name, pObj->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE), NULL, _OVER);
2,028,849✔
2761

2762
  stbRsp.pMeta = taosMemoryCalloc(1, sizeof(STableMetaRsp));
2,028,849✔
2763
  if (NULL == stbRsp.pMeta) {
2,028,849✔
2764
    code = terrno;
×
2765
    goto _OVER;
×
2766
  }
2767

2768
  code = mndBuildStbSchemaImp(NULL, pDb, pObj, name.tname, stbRsp.pMeta, false);
2,028,849✔
2769
  if (code) {
2,028,849✔
2770
    tFreeSMCreateStbRsp(&stbRsp);
×
2771
    goto _OVER;
×
2772
  }
2773

2774
  tEncodeSize(tEncodeSMCreateStbRsp, &stbRsp, contLen, code);
2,028,849✔
2775
  if (code) {
2,028,849✔
2776
    tFreeSMCreateStbRsp(&stbRsp);
×
2777
    goto _OVER;
×
2778
  }
2779

2780
  void *cont = taosMemoryMalloc(contLen);
2,028,849✔
2781
  if (NULL == cont) {
2,028,849✔
2782
    code = terrno;
×
2783
    tFreeSMCreateStbRsp(&stbRsp);
×
2784
    goto _OVER;
×
2785
  }
2786
  tEncoderInit(&ec, cont, contLen);
2,028,849✔
2787
  TAOS_CHECK_GOTO(tEncodeSMCreateStbRsp(&ec, &stbRsp), NULL, _OVER);
2,028,849✔
2788
  tEncoderClear(&ec);
2,028,849✔
2789

2790
  tFreeSMCreateStbRsp(&stbRsp);
2,028,849✔
2791

2792
  *pCont = cont;
2,028,849✔
2793
  *pLen = contLen;
2,028,849✔
2794

2795
  code = 0;
2,028,849✔
2796

2797
_OVER:
2,030,419✔
2798
  if (pObj) {
2,030,419✔
2799
    mndReleaseStb(pMnode, pObj);
2,028,849✔
2800
  }
2801

2802
  if (pDb) {
2,030,419✔
2803
    mndReleaseDb(pMnode, pDb);
2,030,419✔
2804
  }
2805

2806
  TAOS_RETURN(code);
2,030,419✔
2807
}
2808

2809
static int32_t mndAlterStbImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
4,877,488✔
2810
                              void *alterOriData, int32_t alterOriDataLen) {
2811
  int32_t code = -1;
4,877,488✔
2812
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "alter-stb");
4,877,488✔
2813
  if (pTrans == NULL) {
4,877,488✔
2814
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2815
    if (terrno != 0) code = terrno;
×
2816
    goto _OVER;
×
2817
  }
2818

2819
  mInfo("trans:%d, used to alter stb:%s, alterOriDataLen:%d", pTrans->id, pStb->name, alterOriDataLen);
4,877,488✔
2820
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
4,877,488✔
2821
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
4,877,488✔
2822

2823
  if (needRsp) {
4,739,320✔
2824
    void   *pCont = NULL;
4,678,555✔
2825
    int32_t contLen = 0;
4,678,555✔
2826
    TAOS_CHECK_GOTO(mndBuildSMAlterStbRsp(pDb, pStb, &pCont, &contLen), NULL, _OVER);
4,678,555✔
2827
    mndTransSetRpcRsp(pTrans, pCont, contLen);
4,678,555✔
2828
  }
2829

2830
  TAOS_CHECK_GOTO(mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
4,739,320✔
2831
  TAOS_CHECK_GOTO(mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
4,739,320✔
2832
  TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
4,739,320✔
2833
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
4,739,320✔
2834

2835
  code = 0;
4,739,320✔
2836

2837
_OVER:
4,877,488✔
2838
  mndTransDrop(pTrans);
4,877,488✔
2839
  TAOS_RETURN(code);
4,877,488✔
2840
}
2841

2842
static int32_t mndAlterStbAndUpdateTagIdxImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
238,932✔
2843
                                             void *alterOriData, int32_t alterOriDataLen, const SMAlterStbReq *pAlter) {
2844
  int32_t code = -1;
238,932✔
2845
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "alter-stb");
238,932✔
2846
  if (pTrans == NULL) {
238,932✔
2847
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2848
    if (terrno != 0) code = terrno;
×
2849
    goto _OVER;
×
2850
  }
2851

2852
  mInfo("trans:%d, used to alter stb:%s", pTrans->id, pStb->name);
238,932✔
2853
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
238,932✔
2854

2855
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
238,932✔
2856

2857
  if (needRsp) {
238,932✔
2858
    void   *pCont = NULL;
238,932✔
2859
    int32_t contLen = 0;
238,932✔
2860
    TAOS_CHECK_GOTO(mndBuildSMAlterStbRsp(pDb, pStb, &pCont, &contLen), NULL, _OVER);
238,932✔
2861
    mndTransSetRpcRsp(pTrans, pCont, contLen);
238,932✔
2862
  }
2863

2864
  if (pAlter->alterType == TSDB_ALTER_TABLE_DROP_TAG) {
238,932✔
2865
    SIdxObj idxObj = {0};
111,198✔
2866
    SField *pField0 = taosArrayGet(pAlter->pFields, 0);
111,198✔
2867
    bool    exist = false;
111,198✔
2868
    if (mndGetIdxsByTagName(pMnode, pStb, pField0->name, &idxObj) == 0) {
111,198✔
2869
      exist = true;
5,057✔
2870
    }
2871
    TAOS_CHECK_GOTO(mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
111,198✔
2872
    TAOS_CHECK_GOTO(mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
111,198✔
2873

2874
    if (exist == true) {
111,198✔
2875
      TAOS_CHECK_GOTO(mndSetDropIdxPrepareLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
5,057✔
2876
      TAOS_CHECK_GOTO(mndSetDropIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
5,057✔
2877
    }
2878

2879
    TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
111,198✔
2880
    TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
111,198✔
2881

2882
  } else if (pAlter->alterType == TSDB_ALTER_TABLE_UPDATE_TAG_NAME) {
127,734✔
2883
    SIdxObj     idxObj = {0};
127,734✔
2884
    SField     *pField0 = taosArrayGet(pAlter->pFields, 0);
127,734✔
2885
    SField     *pField1 = taosArrayGet(pAlter->pFields, 1);
127,734✔
2886
    const char *oTagName = pField0->name;
127,734✔
2887
    const char *nTagName = pField1->name;
127,734✔
2888
    bool        exist = false;
127,734✔
2889

2890
    if (mndGetIdxsByTagName(pMnode, pStb, pField0->name, &idxObj) == 0) {
127,734✔
2891
      exist = true;
14,569✔
2892
    }
2893

2894
    TAOS_CHECK_GOTO(mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
127,734✔
2895
    TAOS_CHECK_GOTO(mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
127,734✔
2896

2897
    if (exist == true) {
127,734✔
2898
      memcpy(idxObj.colName, nTagName, strlen(nTagName));
14,569✔
2899
      idxObj.colName[strlen(nTagName)] = 0;
14,569✔
2900
      TAOS_CHECK_GOTO(mndSetAlterIdxPrepareLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
14,569✔
2901
      TAOS_CHECK_GOTO(mndSetAlterIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
14,569✔
2902
    }
2903

2904
    TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
127,734✔
2905
    TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
127,734✔
2906
  }
2907
  code = 0;
238,932✔
2908

2909
_OVER:
238,932✔
2910
  mndTransDrop(pTrans);
238,932✔
2911
  TAOS_RETURN(code);
238,932✔
2912
}
2913

2914
static int32_t mndAlterStb(SMnode *pMnode, SRpcMsg *pReq, const SMAlterStbReq *pAlter, SDbObj *pDb, SStbObj *pOld) {
5,969,790✔
2915
  bool    needRsp = true;
5,969,790✔
2916
  int32_t code = -1;
5,969,790✔
2917
  SField *pField0 = NULL;
5,969,790✔
2918

2919
  SStbObj stbObj = {0};
5,969,790✔
2920
  taosRLockLatch(&pOld->lock);
5,969,790✔
2921
  memcpy(&stbObj, pOld, sizeof(SStbObj));
5,969,790✔
2922
  taosRUnLockLatch(&pOld->lock);
5,969,790✔
2923
  stbObj.pColumns = NULL;
5,969,790✔
2924
  stbObj.pTags = NULL;
5,969,790✔
2925
  stbObj.pFuncs = NULL;
5,969,790✔
2926
  stbObj.pCmpr = NULL;
5,969,790✔
2927
  stbObj.pExtSchemas = NULL;
5,969,790✔
2928
  stbObj.updateTime = taosGetTimestampMs();
5,969,790✔
2929
  stbObj.lock = 0;
5,969,790✔
2930
  stbObj.virtualStb = pOld->virtualStb;
5,969,790✔
2931
  bool updateTagIndex = false;
5,969,790✔
2932
  switch (pAlter->alterType) {
5,969,790✔
2933
    case TSDB_ALTER_TABLE_ADD_TAG:
299,947✔
2934
      code = mndAddSuperTableTag(pOld, &stbObj, pAlter->pFields, pAlter->numOfFields);
299,947✔
2935
      break;
299,947✔
2936
    case TSDB_ALTER_TABLE_DROP_TAG:
111,535✔
2937
      pField0 = taosArrayGet(pAlter->pFields, 0);
111,535✔
2938
      code = mndDropSuperTableTag(pMnode, pOld, &stbObj, pField0->name);
111,535✔
2939
      updateTagIndex = true;
111,535✔
2940
      break;
111,535✔
2941
    case TSDB_ALTER_TABLE_UPDATE_TAG_NAME:
138,485✔
2942
      code = mndAlterStbTagName(pMnode, pOld, &stbObj, pAlter->pFields);
138,485✔
2943
      updateTagIndex = true;
138,485✔
2944
      break;
138,485✔
2945
    case TSDB_ALTER_TABLE_UPDATE_TAG_BYTES:
329,006✔
2946
      pField0 = taosArrayGet(pAlter->pFields, 0);
329,006✔
2947
      code = mndAlterStbTagBytes(pMnode, pOld, &stbObj, pField0);
329,006✔
2948
      break;
329,006✔
2949
    case TSDB_ALTER_TABLE_ADD_COLUMN:
2,476,856✔
2950
      code = mndAddSuperTableColumn(pOld, &stbObj, pAlter, pAlter->numOfFields, 0);
2,476,856✔
2951
      break;
2,476,856✔
2952
    case TSDB_ALTER_TABLE_DROP_COLUMN:
1,704,864✔
2953
      pField0 = taosArrayGet(pAlter->pFields, 0);
1,704,864✔
2954
      code = mndDropSuperTableColumn(pMnode, pOld, &stbObj, pField0->name);
1,704,864✔
2955
      break;
1,704,864✔
2956
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES:
522,628✔
2957
      pField0 = taosArrayGet(pAlter->pFields, 0);
522,628✔
2958
      code = mndAlterStbColumnBytes(pMnode, pOld, &stbObj, pField0);
522,628✔
2959
      break;
522,628✔
2960
    case TSDB_ALTER_TABLE_UPDATE_OPTIONS:
25,490✔
2961
      needRsp = false;
25,490✔
2962
      code = mndUpdateTableOptions(pOld, &stbObj, pAlter->comment, pAlter->commentLen, pAlter->ttl, pAlter->keep,
25,490✔
2963
                                   pAlter->secureDelete);
25,490✔
2964
      break;
25,490✔
2965
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_COMPRESS:
96,495✔
2966
      code = mndUpdateSuperTableColumnCompress(pMnode, pOld, &stbObj, pAlter->pFields, pAlter->numOfFields);
96,495✔
2967
      break;
96,495✔
2968
    case TSDB_ALTER_TABLE_ADD_COLUMN_WITH_COMPRESS_OPTION:
264,484✔
2969
      code = mndAddSuperTableColumn(pOld, &stbObj, pAlter, pAlter->numOfFields, 1);
264,484✔
2970
      break;
264,484✔
2971
    default:
×
2972
      needRsp = false;
×
2973
      terrno = TSDB_CODE_OPS_NOT_SUPPORT;
×
2974
      break;
×
2975
  }
2976

2977
  if (code != 0) goto _OVER;
5,969,790✔
2978
  if (updateTagIndex == false) {
5,081,145✔
2979
    code = mndAlterStbImp(pMnode, pReq, pDb, &stbObj, needRsp, pReq->pCont, pReq->contLen);
4,842,213✔
2980
  } else {
2981
    code = mndAlterStbAndUpdateTagIdxImp(pMnode, pReq, pDb, &stbObj, needRsp, pReq->pCont, pReq->contLen, pAlter);
238,932✔
2982
  }
2983

2984
_OVER:
5,969,790✔
2985
  taosMemoryFreeClear(stbObj.pTags);
5,969,790✔
2986
  taosMemoryFreeClear(stbObj.pColumns);
5,969,790✔
2987
  taosMemoryFreeClear(stbObj.pCmpr);
5,969,790✔
2988
  if (pAlter->commentLen > 0) {
5,969,790✔
2989
    taosMemoryFreeClear(stbObj.comment);
6,255✔
2990
  }
2991
  taosMemoryFreeClear(stbObj.pExtSchemas);
5,969,790✔
2992
  TAOS_RETURN(code);
5,969,790✔
2993
}
2994

2995
static int32_t mndProcessAlterStbReq(SRpcMsg *pReq) {
5,985,913✔
2996
  SMnode       *pMnode = pReq->info.node;
5,985,913✔
2997
  int32_t       code = -1;
5,985,913✔
2998
  SDbObj       *pDb = NULL;
5,985,913✔
2999
  SStbObj      *pStb = NULL;
5,985,913✔
3000
  SUserObj     *pOperUser = NULL;
5,985,913✔
3001
  SMAlterStbReq alterReq = {0};
5,985,913✔
3002
  int64_t       tss = taosGetTimestampMs();
5,985,913✔
3003

3004
  if (tDeserializeSMAlterStbReq(pReq->pCont, pReq->contLen, &alterReq) != 0) {
5,985,913✔
3005
    code = TSDB_CODE_INVALID_MSG;
×
3006
    goto _OVER;
×
3007
  }
3008

3009
  mInfo("stb:%s, start to alter", alterReq.name);
5,985,913✔
3010
  if (mndCheckAlterStbReq(&alterReq) != 0) goto _OVER;
5,985,913✔
3011

3012
  pDb = mndAcquireDbByStb(pMnode, alterReq.name);
5,985,913✔
3013
  if (pDb == NULL) {
5,985,913✔
3014
    code = TSDB_CODE_MND_DB_NOT_EXIST;
398✔
3015
    goto _OVER;
398✔
3016
  }
3017
  if (pDb->cfg.isMount) {
5,985,515✔
3018
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
279✔
3019
    goto _OVER;
279✔
3020
  }
3021

3022
  pStb = mndAcquireStb(pMnode, alterReq.name);
5,985,236✔
3023
  if (pStb == NULL) {
5,985,236✔
3024
    code = TSDB_CODE_MND_STB_NOT_EXIST;
15,446✔
3025
    goto _OVER;
15,446✔
3026
  }
3027

3028
  SName   name = {0};
5,969,790✔
3029
  int32_t ret = 0;
5,969,790✔
3030
  if ((ret = tNameFromString(&name, alterReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0)
5,969,790✔
3031
    mError("stb:%s, failed to tNameFromString since %s", alterReq.name, tstrerror(ret));
×
3032

3033
  // if ((code = mndCheckDbPrivilege(pMnode, RPC_MSG_USER(pReq), MND_OPER_WRITE_DB, pDb)) != 0) {
3034
  //   goto _OVER;
3035
  // }
3036
  TAOS_CHECK_GOTO(mndAcquireUser(pMnode, RPC_MSG_USER(pReq), &pOperUser), NULL, _OVER);
5,969,790✔
3037
  TAOS_CHECK_GOTO(mndCheckDbPrivilege(pMnode, RPC_MSG_USER(pReq), RPC_MSG_TOKEN(pReq), MND_OPER_USE_DB, pDb), NULL,
5,969,790✔
3038
                  _OVER);
3039
  TAOS_CHECK_GOTO(mndCheckDbPrivilegeByNameRecF(pMnode, pOperUser, PRIV_CM_ALTER, PRIV_OBJ_TBL, pDb->name, name.tname),
5,969,790✔
3040
                  NULL, _OVER);
3041

3042
  code = mndAlterStb(pMnode, pReq, &alterReq, pDb, pStb);
5,969,790✔
3043
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
5,969,790✔
3044

3045
  if (tsAuditLevel >= AUDIT_LEVEL_DATABASE) {
5,969,790✔
3046
    int64_t tse = taosGetTimestampMs();
5,969,790✔
3047
    double  duration = (double)(tse - tss);
5,969,790✔
3048
    duration = duration / 1000;
5,969,790✔
3049
    auditRecord(pReq, pMnode->clusterId, "alterStb", name.dbname, name.tname, alterReq.sql, alterReq.sqlLen, duration,
5,969,790✔
3050
                0);
3051
  }
3052
_OVER:
5,978,890✔
3053
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
5,985,913✔
3054
    mError("stb:%s, failed to alter since %s", alterReq.name, tstrerror(code));
1,042,936✔
3055
  }
3056

3057
  mndReleaseStb(pMnode, pStb);
5,985,913✔
3058
  mndReleaseDb(pMnode, pDb);
5,985,913✔
3059
  mndReleaseUser(pMnode, pOperUser);
5,985,913✔
3060
  tFreeSMAltertbReq(&alterReq);
5,985,913✔
3061

3062
  TAOS_RETURN(code);
5,985,913✔
3063
}
3064

3065
static int32_t mndSetDropStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SStbObj *pStb) {
482,664✔
3066
  int32_t  code = 0;
482,664✔
3067
  SSdbRaw *pRedoRaw = mndStbActionEncode(pStb);
482,664✔
3068
  if (pRedoRaw == NULL) {
482,664✔
3069
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
3070
    if (terrno != 0) code = terrno;
×
3071
    TAOS_RETURN(code);
×
3072
  }
3073
  if ((code = mndTransAppendPrepareLog(pTrans, pRedoRaw)) != 0) {
482,664✔
3074
    sdbFreeRaw(pRedoRaw);
×
3075
    TAOS_RETURN(code);
×
3076
  }
3077
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_DROPPING));
482,664✔
3078

3079
  TAOS_RETURN(code);
482,664✔
3080
}
3081

3082
static int32_t mndSetDropStbCommitLogs(SMnode *pMnode, STrans *pTrans, SStbObj *pStb) {
482,664✔
3083
  int32_t  code = 0;
482,664✔
3084
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
482,664✔
3085
  if (pCommitRaw == NULL) {
482,664✔
3086
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
3087
    if (terrno != 0) code = terrno;
×
3088
    TAOS_RETURN(code);
×
3089
  }
3090
  if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
482,664✔
3091
    sdbFreeRaw(pCommitRaw);
×
3092
    TAOS_RETURN(code);
×
3093
  }
3094
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED));
482,664✔
3095

3096
  TAOS_RETURN(code);
482,664✔
3097
}
3098

3099
static int32_t mndSetDropStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
482,664✔
3100
  int32_t code = 0;
482,664✔
3101
  SSdb   *pSdb = pMnode->pSdb;
482,664✔
3102
  SVgObj *pVgroup = NULL;
482,664✔
3103
  void   *pIter = NULL;
482,664✔
3104

3105
  while (1) {
1,323,506✔
3106
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
1,806,170✔
3107
    if (pIter == NULL) break;
1,806,170✔
3108
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
1,323,506✔
3109
      sdbRelease(pSdb, pVgroup);
359,457✔
3110
      continue;
359,457✔
3111
    }
3112

3113
    int32_t contLen = 0;
964,049✔
3114
    void   *pReq = mndBuildVDropStbReq(pMnode, pVgroup, pStb, &contLen);
964,049✔
3115
    if (pReq == NULL) {
964,049✔
3116
      sdbCancelFetch(pSdb, pIter);
×
3117
      sdbRelease(pSdb, pVgroup);
×
3118
      code = TSDB_CODE_OUT_OF_MEMORY;
×
3119
      TAOS_RETURN(code);
×
3120
    }
3121

3122
    STransAction action = {0};
964,049✔
3123
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
964,049✔
3124
    action.pCont = pReq;
964,049✔
3125
    action.contLen = contLen;
964,049✔
3126
    action.msgType = TDMT_VND_DROP_STB;
964,049✔
3127
    action.acceptableCode = TSDB_CODE_TDB_STB_NOT_EXIST;
964,049✔
3128
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
964,049✔
3129
      taosMemoryFree(pReq);
×
3130
      sdbCancelFetch(pSdb, pIter);
×
3131
      sdbRelease(pSdb, pVgroup);
×
3132
      TAOS_RETURN(code);
×
3133
    }
3134
    sdbRelease(pSdb, pVgroup);
964,049✔
3135
  }
3136

3137
  TAOS_RETURN(code);
482,664✔
3138
}
3139

3140
static int32_t mndDropStb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb) {
482,664✔
3141
  int32_t code = -1;
482,664✔
3142
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "drop-stb");
482,664✔
3143
  if (pTrans == NULL) {
482,664✔
3144
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
3145
    if (terrno != 0) code = terrno;
×
3146
    goto _OVER;
×
3147
  }
3148

3149
  mInfo("trans:%d, used to drop stb:%s", pTrans->id, pStb->name);
482,664✔
3150
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
482,664✔
3151
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
482,664✔
3152

3153
  TAOS_CHECK_GOTO(mndSetDropStbPrepareLogs(pMnode, pTrans, pStb), NULL, _OVER);
482,664✔
3154
  TAOS_CHECK_GOTO(mndSetDropStbCommitLogs(pMnode, pTrans, pStb), NULL, _OVER);
482,664✔
3155
  TAOS_CHECK_GOTO(mndSetDropStbRedoActions(pMnode, pTrans, pDb, pStb), NULL, _OVER);
482,664✔
3156
  TAOS_CHECK_GOTO(mndDropIdxsByStb(pMnode, pTrans, pDb, pStb), NULL, _OVER);
482,664✔
3157
  TAOS_CHECK_GOTO(mndDropRsmaByStb(pMnode, pTrans, pDb, pStb), NULL, _OVER);
482,664✔
3158
  TAOS_CHECK_GOTO(mndUserRemoveStb(pMnode, pTrans, pStb->name), NULL, _OVER);
482,664✔
3159
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
482,664✔
3160
  code = 0;
482,664✔
3161

3162
_OVER:
482,664✔
3163
  mndTransDrop(pTrans);
482,664✔
3164
  TAOS_RETURN(code);
482,664✔
3165
}
3166

3167
static int32_t mndCheckDropStbForStream(SMnode *pMnode, const char *stbFullName, int64_t suid) {
×
3168
  int32_t code = 0;
×
3169
  SSdb   *pSdb = pMnode->pSdb;
×
3170
  void   *pIter = NULL;
×
3171
  while (1) {
×
3172
    SStreamObj *pStream = NULL;
×
3173
    pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
×
3174
    if (pIter == NULL) break;
×
3175

3176
    if (pStream->pCreate->outStbUid == suid) {
×
3177
      sdbCancelFetch(pSdb, pIter);
×
3178
      sdbRelease(pSdb, pStream);
×
3179
      TAOS_RETURN(-1);
×
3180
    }
3181

3182
    sdbRelease(pSdb, pStream);
×
3183
  }
3184
  TAOS_RETURN(code);
×
3185
}
3186

3187
static int32_t mndProcessDropTtltbRsp(SRpcMsg *pRsp) { return 0; }
×
3188
static int32_t mndProcessTrimDbRsp(SRpcMsg *pRsp) { return 0; }
×
3189
static int32_t mndProcessTrimDbWalRsp(SRpcMsg *pRsp) { return 0; }
2,356✔
3190
static int32_t mndProcessS3MigrateDbRsp(SRpcMsg *pRsp) { return 0; }
×
3191

3192
static int32_t mndProcessDropStbReq(SRpcMsg *pReq) {
938,338✔
3193
  SMnode      *pMnode = pReq->info.node;
938,338✔
3194
  int32_t      code = -1;
938,338✔
3195
  SDbObj      *pDb = NULL;
938,338✔
3196
  SStbObj     *pStb = NULL;
938,338✔
3197
  SUserObj    *pOperUser = NULL;
938,338✔
3198
  SMDropStbReq dropReq = {0};
938,338✔
3199
  int64_t      tss = taosGetTimestampMs();
938,338✔
3200

3201
  TAOS_CHECK_GOTO(tDeserializeSMDropStbReq(pReq->pCont, pReq->contLen, &dropReq), NULL, _OVER);
938,338✔
3202

3203
  mInfo("stb:%s, start to drop", dropReq.name);
938,338✔
3204

3205
  pStb = mndAcquireStb(pMnode, dropReq.name);
938,338✔
3206
  if (pStb == NULL) {
938,338✔
3207
    if (dropReq.igNotExists) {
455,395✔
3208
      mInfo("stb:%s, not exist, ignore not exist is set", dropReq.name);
454,268✔
3209
      code = 0;
454,268✔
3210
      goto _OVER;
454,268✔
3211
    } else {
3212
      code = TSDB_CODE_MND_STB_NOT_EXIST;
1,127✔
3213
      goto _OVER;
1,127✔
3214
    }
3215
  }
3216

3217
  if ((dropReq.source == TD_REQ_FROM_TAOX_OLD || dropReq.source == TD_REQ_FROM_TAOX) && pStb->uid != dropReq.suid) {
482,943✔
3218
    code = 0;
×
3219
    goto _OVER;
×
3220
  }
3221

3222
  pDb = mndAcquireDbByStb(pMnode, dropReq.name);
482,943✔
3223
  if (pDb == NULL) {
482,943✔
3224
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
3225
    goto _OVER;
×
3226
  }
3227

3228
  SName   name = {0};
482,943✔
3229
  int32_t ret = 0;
482,943✔
3230
  if ((ret = tNameFromString(&name, dropReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0)
482,943✔
3231
    mError("stb:%s, failed to tNameFromString since %s", dropReq.name, tstrerror(ret));
×
3232

3233
  // if ((code = mndCheckDbPrivilege(pMnode, RPC_MSG_USER(pReq), MND_OPER_WRITE_DB, pDb)) != 0) {
3234
  //   goto _OVER;
3235
  // }
3236
  TAOS_CHECK_GOTO(mndAcquireUser(pMnode, RPC_MSG_USER(pReq), &pOperUser), NULL, _OVER);
482,943✔
3237
  TAOS_CHECK_GOTO(mndCheckDbPrivilege(pMnode, RPC_MSG_USER(pReq), RPC_MSG_TOKEN(pReq), MND_OPER_USE_DB, pDb), NULL,
482,943✔
3238
                  _OVER);
3239
  TAOS_CHECK_GOTO(
482,943✔
3240
      mndCheckObjPrivilegeRecF(pMnode, pOperUser, PRIV_CM_DROP, PRIV_OBJ_TBL, pStb->ownerId, pDb->name, name.tname),
3241
      NULL, _OVER);
3242

3243
  if (pDb->cfg.isMount) {
482,943✔
3244
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
279✔
3245
    goto _OVER;
279✔
3246
  }
3247

3248
  code = mndDropStb(pMnode, pReq, pDb, pStb);
482,664✔
3249
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
482,664✔
3250

3251
  if (tsAuditLevel >= AUDIT_LEVEL_DATABASE) {
482,664✔
3252
    int64_t tse = taosGetTimestampMs();
482,664✔
3253
    double  duration = (double)(tse - tss);
482,664✔
3254
    duration = duration / 1000;
482,664✔
3255
    auditRecord(pReq, pMnode->clusterId, "dropStb", name.dbname, name.tname, dropReq.sql, dropReq.sqlLen, duration, 0);
482,664✔
3256
  }
3257
_OVER:
937,627✔
3258
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
938,338✔
3259
    mError("stb:%s, failed to drop since %s", dropReq.name, tstrerror(code));
1,406✔
3260
  }
3261

3262
  mndReleaseDb(pMnode, pDb);
938,338✔
3263
  mndReleaseStb(pMnode, pStb);
938,338✔
3264
  mndReleaseUser(pMnode, pOperUser);
938,338✔
3265
  tFreeSMDropStbReq(&dropReq);
938,338✔
3266
  TAOS_RETURN(code);
938,338✔
3267
}
3268

3269
static int32_t mndProcessTableMetaReq(SRpcMsg *pReq) {
19,294,355✔
3270
  SMnode       *pMnode = pReq->info.node;
19,294,355✔
3271
  int32_t       code = -1;
19,294,355✔
3272
  STableInfoReq infoReq = {0};
19,294,355✔
3273
  STableMetaRsp metaRsp = {0};
19,294,355✔
3274
  SUserObj     *pUser = NULL;
19,294,355✔
3275

3276
  code = mndAcquireUser(pMnode, RPC_MSG_USER(pReq), &pUser);
19,294,355✔
3277
  if (pUser == NULL) return 0;
19,294,355✔
3278
  bool sysinfo = pUser->sysInfo;
19,294,355✔
3279

3280
  TAOS_CHECK_GOTO(tDeserializeSTableInfoReq(pReq->pCont, pReq->contLen, &infoReq), NULL, _OVER);
19,294,355✔
3281

3282
  if (0 == strcmp(infoReq.dbFName, TSDB_INFORMATION_SCHEMA_DB)) {
19,294,355✔
3283
    mInfo("information_schema table:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
1,998,224✔
3284
    TAOS_CHECK_GOTO(mndBuildInsTableSchema(pMnode, infoReq.dbFName, infoReq.tbName, sysinfo, &metaRsp), NULL, _OVER);
1,998,224✔
3285
  } else if (0 == strcmp(infoReq.dbFName, TSDB_PERFORMANCE_SCHEMA_DB)) {
17,296,131✔
3286
    mInfo("performance_schema table:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
148,129✔
3287
    TAOS_CHECK_GOTO(mndBuildPerfsTableSchema(pMnode, infoReq.dbFName, infoReq.tbName, &metaRsp), NULL, _OVER);
148,129✔
3288
  } else {
3289
    mInfo("stb:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
17,148,002✔
3290
    TAOS_CHECK_GOTO(mndBuildStbSchema(pMnode, infoReq.dbFName, infoReq.tbName, &metaRsp, true), NULL, _OVER);
17,148,002✔
3291
  }
3292

3293
  int32_t rspLen = tSerializeSTableMetaRsp(NULL, 0, &metaRsp);
18,359,968✔
3294
  if (rspLen < 0) {
18,359,412✔
3295
    code = TSDB_CODE_INVALID_MSG;
×
3296
    goto _OVER;
×
3297
  }
3298

3299
  void *pRsp = rpcMallocCont(rspLen);
18,359,412✔
3300
  if (pRsp == NULL) {
18,359,570✔
3301
    code = terrno;
×
3302
    goto _OVER;
×
3303
  }
3304

3305
  if ((rspLen = tSerializeSTableMetaRsp(pRsp, rspLen, &metaRsp)) < 0) {
18,359,570✔
3306
    code = rspLen;
×
3307
    goto _OVER;
×
3308
  }
3309
  pReq->info.rsp = pRsp;
18,359,968✔
3310
  pReq->info.rspLen = rspLen;
18,359,968✔
3311
  code = 0;
18,359,968✔
3312

3313
  mTrace("%s.%s, meta is retrieved", infoReq.dbFName, infoReq.tbName);
18,359,968✔
3314

3315
_OVER:
19,294,156✔
3316
  if (code != 0) {
19,294,355✔
3317
    mError("stb:%s.%s, failed to retrieve meta since %s", infoReq.dbFName, infoReq.tbName, tstrerror(code));
934,387✔
3318
  }
3319

3320
  mndReleaseUser(pMnode, pUser);
19,294,355✔
3321
  tFreeSTableMetaRsp(&metaRsp);
19,294,355✔
3322
  // TODO change to TAOS_RETURN
3323
  return code;
19,294,355✔
3324
}
3325

3326
static int32_t mndProcessTableCfgReq(SRpcMsg *pReq) {
35,475✔
3327
  SMnode      *pMnode = pReq->info.node;
35,475✔
3328
  int32_t      code = -1;
35,475✔
3329
  STableCfgReq cfgReq = {0};
35,475✔
3330
  STableCfgRsp cfgRsp = {0};
35,475✔
3331

3332
  TAOS_CHECK_GOTO(tDeserializeSTableCfgReq(pReq->pCont, pReq->contLen, &cfgReq), NULL, _OVER);
35,475✔
3333

3334
  char dbName[TSDB_DB_NAME_LEN] = {0};
35,475✔
3335
  TAOS_CHECK_GOTO(mndExtractShortDbNameFromDbFullName(cfgReq.dbFName, dbName), NULL, _OVER);
35,475✔
3336
  if (0 == strcmp(dbName, TSDB_INFORMATION_SCHEMA_DB)) {
35,475✔
3337
    mInfo("information_schema table:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
3,740✔
3338
    TAOS_CHECK_GOTO(mndBuildInsTableCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
3,740✔
3339
  } else if (0 == strcmp(dbName, TSDB_PERFORMANCE_SCHEMA_DB)) {
31,735✔
3340
    mInfo("performance_schema table:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
1,870✔
3341
    TAOS_CHECK_GOTO(mndBuildPerfsTableCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
1,870✔
3342
  } else {
3343
    mInfo("stb:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
29,865✔
3344
    TAOS_CHECK_GOTO(mndBuildStbCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
29,865✔
3345
  }
3346

3347
  int32_t rspLen = tSerializeSTableCfgRsp(NULL, 0, &cfgRsp);
35,475✔
3348
  if (rspLen < 0) {
35,475✔
3349
    code = TSDB_CODE_INVALID_MSG;
×
3350
    goto _OVER;
×
3351
  }
3352

3353
  void *pRsp = rpcMallocCont(rspLen);
35,475✔
3354
  if (pRsp == NULL) {
35,475✔
3355
    code = terrno;
×
3356
    goto _OVER;
×
3357
  }
3358

3359
  if ((rspLen = tSerializeSTableCfgRsp(pRsp, rspLen, &cfgRsp)) < 0) {
35,475✔
3360
    code = rspLen;
×
3361
    goto _OVER;
×
3362
  }
3363
  pReq->info.rsp = pRsp;
35,475✔
3364
  pReq->info.rspLen = rspLen;
35,475✔
3365
  code = 0;
35,475✔
3366

3367
  mTrace("%s.%s, cfg is retrieved", cfgReq.dbFName, cfgReq.tbName);
35,475✔
3368

3369
_OVER:
35,475✔
3370
  if (code != 0) {
35,475✔
3371
    mError("stb:%s.%s, failed to retrieve cfg since %s", cfgReq.dbFName, cfgReq.tbName, tstrerror(code));
×
3372
  }
3373

3374
  tFreeSTableCfgRsp(&cfgRsp);
35,475✔
3375
  TAOS_RETURN(code);
35,475✔
3376
}
3377

3378
int32_t mndValidateStbInfo(SMnode *pMnode, SSTableVersion *pStbVersions, int32_t numOfStbs, void **ppRsp,
6,297,850✔
3379
                           int32_t *pRspLen) {
3380
  int32_t   code = 0;
6,297,850✔
3381
  SSTbHbRsp hbRsp = {0};
6,297,850✔
3382
  hbRsp.pMetaRsp = taosArrayInit(numOfStbs, sizeof(STableMetaRsp));
6,297,850✔
3383
  if (hbRsp.pMetaRsp == NULL) {
6,297,850✔
3384
    code = terrno;
×
3385
    TAOS_RETURN(code);
×
3386
  }
3387

3388
  hbRsp.pIndexRsp = taosArrayInit(numOfStbs, sizeof(STableIndexRsp));
6,297,850✔
3389
  if (NULL == hbRsp.pIndexRsp) {
6,297,850✔
3390
    taosArrayDestroy(hbRsp.pMetaRsp);
×
3391
    code = terrno;
×
3392
    TAOS_RETURN(code);
×
3393
  }
3394

3395
  for (int32_t i = 0; i < numOfStbs; ++i) {
15,252,565✔
3396
    SSTableVersion *pStbVersion = &pStbVersions[i];
8,954,715✔
3397
    pStbVersion->suid = be64toh(pStbVersion->suid);
8,954,715✔
3398
    pStbVersion->sversion = ntohl(pStbVersion->sversion);
8,954,715✔
3399
    pStbVersion->tversion = ntohl(pStbVersion->tversion);
8,954,715✔
3400
    pStbVersion->smaVer = ntohl(pStbVersion->smaVer);
8,954,715✔
3401

3402
    bool    schema = false;
8,954,715✔
3403
    bool    sma = false;
8,954,715✔
3404
    int32_t code = mndValidateStbVersion(pMnode, pStbVersion, &schema, &sma);
8,954,715✔
3405
    if (TSDB_CODE_SUCCESS != code) {
8,954,715✔
3406
      STableMetaRsp metaRsp = {0};
42,257✔
3407
      metaRsp.numOfColumns = -1;
42,257✔
3408
      metaRsp.suid = pStbVersion->suid;
42,257✔
3409
      tstrncpy(metaRsp.dbFName, pStbVersion->dbFName, sizeof(metaRsp.dbFName));
42,257✔
3410
      tstrncpy(metaRsp.tbName, pStbVersion->stbName, sizeof(metaRsp.tbName));
42,257✔
3411
      tstrncpy(metaRsp.stbName, pStbVersion->stbName, sizeof(metaRsp.stbName));
42,257✔
3412
      if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
84,514✔
3413
        code = terrno;
×
3414
        return code;
×
3415
      }
3416
      continue;
42,257✔
3417
    }
3418

3419
    if (schema) {
8,912,458✔
3420
      STableMetaRsp metaRsp = {0};
19,732✔
3421
      mInfo("stb:%s.%s, start to retrieve meta", pStbVersion->dbFName, pStbVersion->stbName);
19,732✔
3422
      if (mndBuildStbSchema(pMnode, pStbVersion->dbFName, pStbVersion->stbName, &metaRsp, false) != 0) {
19,732✔
3423
        metaRsp.numOfColumns = -1;
×
3424
        metaRsp.suid = pStbVersion->suid;
×
3425
        tstrncpy(metaRsp.dbFName, pStbVersion->dbFName, sizeof(metaRsp.dbFName));
×
3426
        tstrncpy(metaRsp.tbName, pStbVersion->stbName, sizeof(metaRsp.tbName));
×
3427
        tstrncpy(metaRsp.stbName, pStbVersion->stbName, sizeof(metaRsp.stbName));
×
3428
        if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
×
3429
          code = terrno;
×
3430
          return code;
×
3431
        }
3432
        continue;
×
3433
      }
3434

3435
      if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
39,464✔
3436
        code = terrno;
×
3437
        return code;
×
3438
      }
3439
    }
3440

3441
    if (sma) {
8,912,458✔
3442
      bool           exist = false;
×
3443
      char           tbFName[TSDB_TABLE_FNAME_LEN];
×
3444
      STableIndexRsp indexRsp = {0};
×
3445
      indexRsp.pIndex = taosArrayInit(10, sizeof(STableIndexInfo));
×
3446
      if (NULL == indexRsp.pIndex) {
×
3447
        code = terrno;
×
3448
        TAOS_RETURN(code);
×
3449
      }
3450

3451
      (void)snprintf(tbFName, sizeof(tbFName), "%s.%s", pStbVersion->dbFName, pStbVersion->stbName);
×
3452
      tstrncpy(indexRsp.dbFName, pStbVersion->dbFName, sizeof(indexRsp.dbFName));
×
3453
      tstrncpy(indexRsp.tbName, pStbVersion->stbName, sizeof(indexRsp.tbName));
×
3454

3455
      if (taosArrayPush(hbRsp.pIndexRsp, &indexRsp) == NULL) {
×
3456
        code = terrno;
×
3457
        return code;
×
3458
      }
3459
    }
3460
  }
3461

3462
  int32_t rspLen = tSerializeSSTbHbRsp(NULL, 0, &hbRsp);
6,297,850✔
3463
  if (rspLen < 0) {
6,297,850✔
3464
    tFreeSSTbHbRsp(&hbRsp);
×
3465
    code = TSDB_CODE_INVALID_MSG;
×
3466
    TAOS_RETURN(code);
×
3467
  }
3468

3469
  void *pRsp = taosMemoryMalloc(rspLen);
6,297,850✔
3470
  if (pRsp == NULL) {
6,297,850✔
3471
    tFreeSSTbHbRsp(&hbRsp);
×
3472
    code = terrno;
×
3473
    TAOS_RETURN(code);
×
3474
  }
3475

3476
  rspLen = tSerializeSSTbHbRsp(pRsp, rspLen, &hbRsp);
6,297,850✔
3477
  tFreeSSTbHbRsp(&hbRsp);
6,297,850✔
3478
  if (rspLen < 0) return rspLen;
6,297,850✔
3479
  *ppRsp = pRsp;
6,297,850✔
3480
  *pRspLen = rspLen;
6,297,850✔
3481
  TAOS_RETURN(code);
6,297,850✔
3482
}
3483

3484
int32_t mndGetNumOfStbs(SMnode *pMnode, char *dbName, int32_t *pNumOfStbs) {
2,099,250✔
3485
  int32_t code = 0;
2,099,250✔
3486
  SSdb   *pSdb = pMnode->pSdb;
2,099,250✔
3487
  SDbObj *pDb = mndAcquireDb(pMnode, dbName);
2,099,250✔
3488
  if (pDb == NULL) {
2,099,250✔
3489
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
3490
    TAOS_RETURN(code);
×
3491
  }
3492

3493
  int32_t numOfStbs = 0;
2,099,250✔
3494
  void   *pIter = NULL;
2,099,250✔
3495
  while (1) {
32,634,098✔
3496
    SStbObj *pStb = NULL;
34,733,348✔
3497
    pIter = sdbFetch(pSdb, SDB_STB, pIter, (void **)&pStb);
34,733,348✔
3498
    if (pIter == NULL) break;
34,733,348✔
3499

3500
    if (pStb->dbUid == pDb->uid) {
32,634,098✔
3501
      numOfStbs++;
21,718,237✔
3502
    }
3503

3504
    sdbRelease(pSdb, pStb);
32,634,098✔
3505
  }
3506

3507
  *pNumOfStbs = numOfStbs;
2,099,250✔
3508
  mndReleaseDb(pMnode, pDb);
2,099,250✔
3509
  TAOS_RETURN(code);
2,099,250✔
3510
}
3511

3512
int32_t mndExtractDbNameFromStbFullName(const char *stbFullName, char *dst) {
×
3513
  SName name = {0};
×
3514
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
×
3515

3516
  TAOS_CHECK_RETURN(tNameGetFullDbName(&name, dst));
×
3517

3518
  return 0;
×
3519
}
3520

3521
int32_t mndExtractShortDbNameFromStbFullName(const char *stbFullName, char *dst) {
×
3522
  SName name = {0};
×
3523
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
×
3524

3525
  TAOS_CHECK_RETURN(tNameGetDbName(&name, dst));
×
3526

3527
  return 0;
×
3528
}
3529

3530
int32_t mndExtractShortDbNameFromDbFullName(const char *stbFullName, char *dst) {
35,475✔
3531
  SName name = {0};
35,475✔
3532
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB));
35,475✔
3533

3534
  TAOS_CHECK_RETURN(tNameGetDbName(&name, dst));
35,475✔
3535

3536
  return 0;
35,475✔
3537
}
3538

3539
void mndExtractTbNameFromStbFullName(const char *stbFullName, char *dst, int32_t dstSize) {
3,091,332✔
3540
  int32_t pos = -1;
3,091,332✔
3541
  int32_t num = 0;
3,091,332✔
3542
  for (pos = 0; stbFullName[pos] != 0; ++pos) {
28,724,950✔
3543
    if (stbFullName[pos] == TS_PATH_DELIMITER[0]) num++;
28,724,950✔
3544
    if (num == 2) break;
28,724,950✔
3545
  }
3546

3547
  if (num == 2) {
3,091,332✔
3548
    tstrncpy(dst, stbFullName + pos + 1, dstSize);
3,091,332✔
3549
  }
3550
}
3,091,332✔
3551

3552
static int32_t mndRetrieveStb(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
285,422✔
3553
  SMnode    *pMnode = pReq->info.node;
285,422✔
3554
  SSdb      *pSdb = pMnode->pSdb;
285,422✔
3555
  int32_t    numOfRows = 0;
285,422✔
3556
  SStbObj   *pStb = NULL;
285,422✔
3557
  SUserObj  *pOperUser = NULL;
285,422✔
3558
  SSHashObj *pUidNames = NULL;
285,422✔
3559
  int32_t    cols = 0;
285,422✔
3560
  int32_t    lino = 0;
285,422✔
3561
  int32_t    code = 0;
285,422✔
3562
  char       objFName[TSDB_OBJ_FNAME_LEN + 1] = {0};
285,422✔
3563
  bool       showAll = false;
285,422✔
3564

3565
  SDbObj *pDb = NULL;
285,422✔
3566
  if (strlen(pShow->db) > 0) {
285,422✔
3567
    pDb = mndAcquireDb(pMnode, pShow->db);
230,571✔
3568
    if (pDb == NULL) return terrno;
230,571✔
3569
  }
3570

3571
  if ((code = mndAcquireUser(pMnode, RPC_MSG_USER(pReq), &pOperUser)) != 0) {
284,415✔
3572
    goto _ERROR;
×
3573
  }
3574

3575
  (void)snprintf(objFName, sizeof(objFName), "%d.*", pOperUser->acctId);
284,415✔
3576
  showAll = (0 == mndCheckObjPrivilegeRecF(pMnode, pOperUser, PRIV_CM_SHOW, PRIV_OBJ_TBL, pDb ? pDb->ownerId : 0,
284,415✔
3577
                                           pDb ? pDb->name : objFName, "*"));
3578
  showAll = showAll && (0 == mndCheckDbPrivilegeByName(pMnode, RPC_MSG_USER(pReq), RPC_MSG_TOKEN(pReq), MND_OPER_USE_DB,
284,415✔
3579
                                                       pDb ? pDb->name : objFName, false));
3580

3581
  while (numOfRows < rows) {
2,199,749✔
3582
    pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb);
2,198,671✔
3583
    if (pShow->pIter == NULL) break;
2,198,671✔
3584

3585
    if (pDb != NULL && pStb->dbUid != pDb->uid) {
1,915,334✔
3586
      sdbRelease(pSdb, pStb);
946,474✔
3587
      continue;
946,474✔
3588
    }
3589

3590
    if (isTsmaResSTb(pStb->name)) {
968,860✔
3591
      sdbRelease(pSdb, pStb);
×
3592
      continue;
×
3593
    }
3594

3595
#if 0
3596
    if ((0 == pUser->superUser) && mndCheckStbPrivilege(pMnode, pUser, RPC_MSG_TOKEN(pReq), MND_OPER_SHOW_STB, pStb) != 0) {
3597
      sdbRelease(pSdb, pStb);
3598
      terrno = 0;
3599
      continue;
3600
    }
3601
#endif
3602
    cols = 0;
968,860✔
3603

3604
    SName name = {0};
968,860✔
3605

3606
    char stbName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
968,860✔
3607
    mndExtractTbNameFromStbFullName(pStb->name, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN);
968,860✔
3608

3609
    if (!showAll && (mndCheckObjPrivilegeRecF(pMnode, pOperUser, PRIV_CM_SHOW, PRIV_OBJ_TBL, pStb->ownerId, pStb->db,
968,860✔
3610
                                              &stbName[VARSTR_HEADER_SIZE]) ||
3,202✔
3611
                     mndCheckDbPrivilegeByName(pMnode, RPC_MSG_USER(pReq), RPC_MSG_TOKEN(pReq), MND_OPER_USE_DB,
3,202✔
3612
                                               pStb->db, false))) {
3,202✔
3613
      sdbRelease(pSdb, pStb);
2,026✔
3614
      terrno = 0;
2,026✔
3615
      continue;
2,026✔
3616
    }
3617

3618
    varDataSetLen(stbName, strlen(&stbName[VARSTR_HEADER_SIZE]));
966,834✔
3619
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
966,834✔
3620
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stbName, false), pStb, &lino, _ERROR);
966,834✔
3621

3622
    char db[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
966,834✔
3623
    RETRIEVE_CHECK_GOTO(tNameFromString(&name, pStb->db, T_NAME_ACCT | T_NAME_DB), pStb, &lino, _ERROR);
966,834✔
3624
    RETRIEVE_CHECK_GOTO(tNameGetDbName(&name, varDataVal(db)), pStb, &lino, _ERROR);
966,834✔
3625
    varDataSetLen(db, strlen(varDataVal(db)));
966,834✔
3626
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
966,834✔
3627
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)db, false), pStb, &lino, _ERROR);
966,834✔
3628

3629
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
966,834✔
3630
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->createdTime, false), pStb, &lino,
966,834✔
3631
                        _ERROR);
3632

3633
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
966,834✔
3634
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->numOfColumns, false), pStb, &lino,
966,834✔
3635
                        _ERROR);
3636

3637
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
966,834✔
3638
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->numOfTags, false), pStb, &lino, _ERROR);
966,834✔
3639

3640
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
966,834✔
3641
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->updateTime, false), pStb, &lino,
966,834✔
3642
                        _ERROR);  // number of tables
3643

3644
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
966,834✔
3645
    if (pStb->commentLen > 0) {
966,834✔
3646
      char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
19,442✔
3647
      STR_TO_VARSTR(comment, pStb->comment);
19,442✔
3648
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, comment, false), pStb, &lino, _ERROR);
19,442✔
3649
    } else if (pStb->commentLen == 0) {
947,392✔
3650
      char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
130,261✔
3651
      STR_TO_VARSTR(comment, "");
130,261✔
3652
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, comment, false), pStb, &lino, _ERROR);
130,261✔
3653
    } else {
3654
      colDataSetNULL(pColInfo, numOfRows);
817,131✔
3655
    }
3656

3657
    char watermark[64 + VARSTR_HEADER_SIZE] = {0};
966,834✔
3658
    (void)snprintf(varDataVal(watermark), sizeof(watermark) - VARSTR_HEADER_SIZE, "%" PRId64 "a,%" PRId64 "a",
1,931,479✔
3659
                   pStb->watermark[0], pStb->watermark[1]);
1,931,479✔
3660
    varDataSetLen(watermark, strlen(varDataVal(watermark)));
966,834✔
3661

3662
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
966,834✔
3663
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)watermark, false), pStb, &lino, _ERROR);
966,834✔
3664

3665
    char maxDelay[64 + VARSTR_HEADER_SIZE] = {0};
966,834✔
3666
    (void)snprintf(varDataVal(maxDelay), sizeof(maxDelay) - VARSTR_HEADER_SIZE, "%" PRId64 "a,%" PRId64 "a",
1,931,479✔
3667
                   pStb->maxdelay[0], pStb->maxdelay[1]);
1,931,479✔
3668
    varDataSetLen(maxDelay, strlen(varDataVal(maxDelay)));
966,834✔
3669

3670
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
966,834✔
3671
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)maxDelay, false), pStb, &lino, _ERROR);
966,834✔
3672

3673
    char    rollup[160 + VARSTR_HEADER_SIZE] = {0};
966,834✔
3674
    int32_t rollupNum = (int32_t)taosArrayGetSize(pStb->pFuncs);
966,834✔
3675
    char   *sep = ", ";
966,834✔
3676
    int32_t sepLen = strlen(sep);
966,834✔
3677
    int32_t rollupLen = sizeof(rollup) - VARSTR_HEADER_SIZE - 2;
966,834✔
3678
    for (int32_t i = 0; i < rollupNum; ++i) {
966,834✔
3679
      char *funcName = taosArrayGet(pStb->pFuncs, i);
×
3680
      if (i) {
×
3681
        (void)strncat(varDataVal(rollup), sep, rollupLen);
×
3682
        rollupLen -= sepLen;
×
3683
      }
3684
      (void)strncat(varDataVal(rollup), funcName, rollupLen);
×
3685
      rollupLen -= strlen(funcName);
×
3686
    }
3687
    varDataSetLen(rollup, strlen(varDataVal(rollup)));
966,834✔
3688

3689
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
966,834✔
3690
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)rollup, false), pStb, &lino, _ERROR);
966,834✔
3691

3692
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
966,834✔
3693
    if (pColInfo) {
966,834✔
3694
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->uid), false), pStb, &lino, _ERROR);
966,834✔
3695
    }
3696

3697
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
966,834✔
3698
    if (pColInfo) {
966,834✔
3699
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->virtualStb), false), pStb, &lino, _ERROR);
966,834✔
3700
    }
3701

3702
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
966,834✔
3703
    if (pColInfo) {
966,834✔
3704
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->keep), false), pStb, &lino, _ERROR);
966,834✔
3705
    }
3706

3707
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
966,834✔
3708
    if (pColInfo) {
966,834✔
3709
      if (!pUidNames) {
966,834✔
3710
        TAOS_CHECK_GOTO(mndBuildUidNamesHash(pMnode, &pUidNames), &lino, _OVER);
220,886✔
3711
      }
3712
      const char *ownerName = tSimpleHashGet(pUidNames, (const char *)&pStb->ownerId, sizeof(pStb->ownerId));
966,834✔
3713
      char        owner[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
966,834✔
3714
      STR_WITH_MAXSIZE_TO_VARSTR(owner, ownerName ? ownerName : "[unknown]", sizeof(owner));
966,834✔
3715
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)owner, false), pStb, &lino, _ERROR);
966,834✔
3716
    }
3717

3718
    numOfRows++;
966,834✔
3719
    sdbRelease(pSdb, pStb);
966,834✔
3720
  }
3721

3722
  if (pDb != NULL) {
284,415✔
3723
    mndReleaseDb(pMnode, pDb);
229,564✔
3724
  }
3725
  if (pOperUser != NULL) {
284,415✔
3726
    mndReleaseUser(pMnode, pOperUser);
284,415✔
3727
  }
3728

3729
  goto _OVER;
284,415✔
3730

3731
_ERROR:
×
3732
  if (pDb != NULL) {
×
3733
    mndReleaseDb(pMnode, pDb);
×
3734
  }
3735
  if (pOperUser != NULL) {
×
3736
    mndReleaseUser(pMnode, pOperUser);
×
3737
  }
3738
  mError("show:0x%" PRIx64 ", failed to retrieve data at %s:%d since %s", pShow->id, __FUNCTION__, lino,
×
3739
         tstrerror(code));
3740

3741
_OVER:
281,828✔
3742
  pShow->numOfRows += numOfRows;
284,415✔
3743
  tSimpleHashCleanup(pUidNames);
284,415✔
3744
  return numOfRows;
284,415✔
3745
}
3746

3747
static int32_t buildDbColsInfoBlock(const SSDataBlock *p, const SSysTableMeta *pSysDbTableMeta, size_t size,
1,857,436✔
3748
                                    const char *dbName, const char *tbName) {
3749
  char    tName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,857,436✔
3750
  char    dName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,857,436✔
3751
  char    typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,857,436✔
3752
  int32_t numOfRows = p->info.rows;
1,857,436✔
3753
  int32_t lino = 0;
1,857,436✔
3754
  int32_t code = 0;
1,857,436✔
3755

3756
  STR_TO_VARSTR(dName, dbName);
1,857,436✔
3757
  STR_TO_VARSTR(typeName, "SYSTEM_TABLE");
1,857,436✔
3758

3759
  for (int32_t i = 0; i < size; ++i) {
63,152,293✔
3760
    const SSysTableMeta *pm = &pSysDbTableMeta[i];
61,294,857✔
3761
    //    if (pm->sysInfo) {
3762
    //      continue;
3763
    //    }
3764
    if (tbName[0] && strncmp(tbName, pm->name, TSDB_TABLE_NAME_LEN) != 0) {
61,294,857✔
3765
      continue;
×
3766
    }
3767

3768
    STR_TO_VARSTR(tName, pm->name);
61,294,857✔
3769

3770
    for (int32_t j = 0; j < pm->colNum; j++) {
612,896,532✔
3771
      // table name
3772
      SColumnInfoData *pColInfoData = taosArrayGet(p->pDataBlock, 0);
551,583,090✔
3773
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, tName, false), &lino, _OVER);
551,583,090✔
3774

3775
      // database name
3776
      pColInfoData = taosArrayGet(p->pDataBlock, 1);
551,591,055✔
3777
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, dName, false), &lino, _OVER);
551,546,451✔
3778

3779
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
551,600,613✔
3780
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, typeName, false), &lino, _OVER);
551,598,489✔
3781

3782
      // col name
3783
      char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
551,592,648✔
3784
      STR_TO_VARSTR(colName, pm->schema[j].name);
551,589,462✔
3785
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
551,565,036✔
3786
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, colName, false), &lino, _OVER);
551,621,322✔
3787

3788
      // col type
3789
      int8_t colType = pm->schema[j].type;
551,601,675✔
3790
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
551,604,330✔
3791
      char colTypeStr[VARSTR_HEADER_SIZE + 32];
551,597,427✔
3792
      int  colTypeLen =
3793
          snprintf(varDataVal(colTypeStr), sizeof(colTypeStr) - VARSTR_HEADER_SIZE, "%s", tDataTypes[colType].name);
551,597,958✔
3794
      if (colType == TSDB_DATA_TYPE_VARCHAR) {
551,606,985✔
3795
        colTypeLen +=
278,592,036✔
3796
            snprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d)",
278,592,036✔
3797
                     (int32_t)(pm->schema[j].bytes - VARSTR_HEADER_SIZE));
278,591,505✔
3798
      } else if (colType == TSDB_DATA_TYPE_NCHAR) {
273,015,480✔
3799
        colTypeLen +=
×
3800
            snprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d)",
×
3801
                     (int32_t)((pm->schema[j].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
×
3802
      }
3803
      varDataSetLen(colTypeStr, colTypeLen);
551,607,516✔
3804
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, (char *)colTypeStr, false), &lino, _OVER);
551,543,265✔
3805

3806
      // col length
3807
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
551,603,268✔
3808
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, (const char *)&pm->schema[j].bytes, false), &lino, _OVER);
551,604,861✔
3809

3810
      // col precision, col scale, col nullable, col source
3811
      for (int32_t k = 6; k <= 10; ++k) {
2,147,483,647✔
3812
        pColInfoData = taosArrayGet(p->pDataBlock, k);
2,147,483,647✔
3813
        colDataSetNULL(pColInfoData, numOfRows);
2,147,483,647✔
3814
      }
3815

3816
      numOfRows += 1;
551,483,793✔
3817
    }
3818
  }
3819
  return numOfRows;
1,857,436✔
3820
_OVER:
×
3821
  mError("failed at %s:%d since %s", __FUNCTION__, lino, tstrerror(code));
×
3822
  return numOfRows;
×
3823
}
3824
#define BUILD_COL_FOR_INFO_DB 1
3825
#define BUILD_COL_FOR_PERF_DB 1 << 1
3826
#define BUILD_COL_FOR_USER_DB 1 << 2
3827
#define BUILD_COL_FOR_ALL_DB  (BUILD_COL_FOR_INFO_DB | BUILD_COL_FOR_PERF_DB | BUILD_COL_FOR_USER_DB)
3828

3829
static int32_t buildSysDbColsInfo(SSDataBlock *p, int8_t buildWhichDBs, char *tb) {
980,204✔
3830
  size_t               size = 0;
980,204✔
3831
  const SSysTableMeta *pSysDbTableMeta = NULL;
980,204✔
3832

3833
  if (buildWhichDBs & BUILD_COL_FOR_INFO_DB) {
980,204✔
3834
    getInfosDbMeta(&pSysDbTableMeta, &size);
928,718✔
3835
    p->info.rows = buildDbColsInfoBlock(p, pSysDbTableMeta, size, TSDB_INFORMATION_SCHEMA_DB, tb);
928,718✔
3836
  }
3837

3838
  if (buildWhichDBs & BUILD_COL_FOR_PERF_DB) {
980,204✔
3839
    getPerfDbMeta(&pSysDbTableMeta, &size);
928,718✔
3840
    p->info.rows = buildDbColsInfoBlock(p, pSysDbTableMeta, size, TSDB_PERFORMANCE_SCHEMA_DB, tb);
928,718✔
3841
  }
3842

3843
  return p->info.rows;
980,204✔
3844
}
3845

3846
static int8_t determineBuildColForWhichDBs(const char *db) {
984,188✔
3847
  int8_t buildWhichDBs;
3848
  if (!db[0])
984,188✔
3849
    buildWhichDBs = BUILD_COL_FOR_ALL_DB;
928,552✔
3850
  else {
3851
    char *p = strchr(db, '.');
55,636✔
3852
    if (p && strcmp(p + 1, TSDB_INFORMATION_SCHEMA_DB) == 0) {
55,636✔
3853
      buildWhichDBs = BUILD_COL_FOR_INFO_DB;
166✔
3854
    } else if (p && strcmp(p + 1, TSDB_PERFORMANCE_SCHEMA_DB) == 0) {
55,470✔
3855
      buildWhichDBs = BUILD_COL_FOR_PERF_DB;
166✔
3856
    } else {
3857
      buildWhichDBs = BUILD_COL_FOR_USER_DB;
55,304✔
3858
    }
3859
  }
3860
  return buildWhichDBs;
984,188✔
3861
}
3862

3863
static int32_t mndRetrieveStbCol(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
983,657✔
3864
  uint8_t  buildWhichDBs;
3865
  SMnode  *pMnode = pReq->info.node;
983,657✔
3866
  SSdb    *pSdb = pMnode->pSdb;
984,188✔
3867
  SStbObj *pStb = NULL;
984,188✔
3868
  int32_t  numOfRows = 0;
984,188✔
3869
  int32_t  lino = 0;
984,188✔
3870
  int32_t  code = 0;
984,188✔
3871

3872
  buildWhichDBs = determineBuildColForWhichDBs(pShow->db);
984,188✔
3873

3874
  if (!pShow->sysDbRsp) {
984,188✔
3875
    numOfRows = buildSysDbColsInfo(pBlock, buildWhichDBs, pShow->filterTb);
980,204✔
3876
    mDebug("mndRetrieveStbCol get system table cols, rows:%d, db:%s", numOfRows, pShow->db);
980,204✔
3877
    pShow->sysDbRsp = true;
980,204✔
3878
  }
3879

3880
  if (buildWhichDBs & BUILD_COL_FOR_USER_DB) {
984,188✔
3881
    SDbObj *pDb = NULL;
983,856✔
3882
    if (strlen(pShow->db) > 0) {
983,856✔
3883
      pDb = mndAcquireDb(pMnode, pShow->db);
55,304✔
3884
      if (pDb == NULL && TSDB_CODE_MND_DB_NOT_EXIST != terrno && pBlock->info.rows == 0) return terrno;
55,304✔
3885
    }
3886

3887
    char typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
983,856✔
3888
    STR_TO_VARSTR(typeName, "SUPER_TABLE");
983,856✔
3889
    bool fetch = pShow->restore ? false : true;
983,856✔
3890
    pShow->restore = false;
983,856✔
3891
    while (numOfRows < rows) {
2,999,427✔
3892
      if (fetch) {
2,999,427✔
3893
        pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb);
2,995,443✔
3894
        if (pShow->pIter == NULL) break;
2,995,443✔
3895
      } else {
3896
        fetch = true;
3,984✔
3897
        void *pKey = taosHashGetKey(pShow->pIter, NULL);
3,984✔
3898
        pStb = sdbAcquire(pSdb, SDB_STB, pKey);
3,984✔
3899
        if (!pStb) continue;
3,984✔
3900
      }
3901

3902
      if (pDb != NULL && pStb->dbUid != pDb->uid) {
2,019,555✔
3903
        sdbRelease(pSdb, pStb);
2,744✔
3904
        continue;
2,744✔
3905
      }
3906

3907
      SName name = {0};
2,016,811✔
3908
      char  stbName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
2,016,811✔
3909
      mndExtractTbNameFromStbFullName(pStb->name, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN);
2,016,811✔
3910
      if (pShow->filterTb[0] && strncmp(pShow->filterTb, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN) != 0) {
2,016,811✔
3911
        sdbRelease(pSdb, pStb);
×
3912
        continue;
×
3913
      }
3914

3915
      if ((numOfRows + pStb->numOfColumns) > rows) {
2,016,811✔
3916
        pShow->restore = true;
3,984✔
3917
        if (numOfRows == 0) {
3,984✔
3918
          mError("mndRetrieveStbCol failed to get stable cols since buf:%d less than result:%d, stable name:%s, db:%s",
×
3919
                 rows, pStb->numOfColumns, pStb->name, pStb->db);
3920
        }
3921
        sdbRelease(pSdb, pStb);
3,984✔
3922
        break;
3,984✔
3923
      }
3924

3925
      varDataSetLen(stbName, strlen(&stbName[VARSTR_HEADER_SIZE]));
2,012,827✔
3926

3927
      mDebug("mndRetrieveStbCol get stable cols, stable name:%s, db:%s", pStb->name, pStb->db);
2,012,827✔
3928

3929
      char db[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
2,012,827✔
3930
      RETRIEVE_CHECK_GOTO(tNameFromString(&name, pStb->db, T_NAME_ACCT | T_NAME_DB), pStb, &lino, _OVER);
2,012,827✔
3931
      RETRIEVE_CHECK_GOTO(tNameGetDbName(&name, varDataVal(db)), pStb, &lino, _OVER);
2,012,827✔
3932
      varDataSetLen(db, strlen(varDataVal(db)));
2,012,827✔
3933

3934
      for (int i = 0; i < pStb->numOfColumns; i++) {
35,736,423✔
3935
        int32_t          cols = 0;
33,723,596✔
3936
        SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
33,723,596✔
3937
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stbName, false), pStb, &lino, _OVER);
33,723,596✔
3938

3939
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
33,723,596✔
3940
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)db, false), pStb, &lino, _OVER);
33,723,596✔
3941

3942
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
33,723,596✔
3943
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, typeName, false), pStb, &lino, _OVER);
33,723,596✔
3944

3945
        // col name
3946
        char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
33,723,596✔
3947
        STR_TO_VARSTR(colName, pStb->pColumns[i].name);
33,723,596✔
3948
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
33,723,596✔
3949
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, colName, false), pStb, &lino, _OVER);
33,723,596✔
3950

3951
        // col type
3952
        int8_t colType = pStb->pColumns[i].type;
33,723,596✔
3953
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
33,723,596✔
3954
        char colTypeStr[VARSTR_HEADER_SIZE + 32];
33,723,596✔
3955
        int  colTypeLen =
3956
            snprintf(varDataVal(colTypeStr), sizeof(colTypeStr) - VARSTR_HEADER_SIZE, "%s", tDataTypes[colType].name);
33,723,596✔
3957
        if (colType == TSDB_DATA_TYPE_VARCHAR) {
33,723,596✔
3958
          colTypeLen +=
1,034,574✔
3959
              snprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE,
1,034,574✔
3960
                       "(%d)", (int32_t)(pStb->pColumns[i].bytes - VARSTR_HEADER_SIZE));
1,034,574✔
3961
        } else if (colType == TSDB_DATA_TYPE_NCHAR) {
32,689,022✔
3962
          colTypeLen +=
1,034,218✔
3963
              snprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE,
1,034,218✔
3964
                       "(%d)", (int32_t)((pStb->pColumns[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
1,034,218✔
3965
        } else if (IS_DECIMAL_TYPE(colType)) {
31,654,804✔
3966
          STypeMod typeMod = pStb->pExtSchemas[i].typeMod;
186,405✔
3967
          uint8_t prec = 0, scale = 0;
186,405✔
3968
          decimalFromTypeMod(typeMod, &prec, &scale);
186,405✔
3969
          colTypeLen += snprintf(varDataVal(colTypeStr) + colTypeLen,
186,405✔
3970
                                 sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d,%d)", prec, scale);
3971
        }
3972
        varDataSetLen(colTypeStr, colTypeLen);
33,723,596✔
3973
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (char *)colTypeStr, false), pStb, &lino, _OVER);
33,723,596✔
3974

3975
        // col length
3976
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
33,723,596✔
3977
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->pColumns[i].bytes, false), pStb,
33,723,596✔
3978
                            &lino, _OVER);
3979
        
3980
        // col precision, col scale, col nullable, col source
3981
        for (int32_t j = 6; j <= 9; ++j) {
168,616,918✔
3982
          pColInfo = taosArrayGet(pBlock->pDataBlock, j);
134,893,853✔
3983
          colDataSetNULL(pColInfo, numOfRows);
134,893,853✔
3984
        }
3985

3986
        // col id
3987
        pColInfo = taosArrayGet(pBlock->pDataBlock, 10);
33,723,065✔
3988
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->pColumns[i].colId, false), pStb,
33,723,596✔
3989
                            &lino, _OVER);
3990
        numOfRows++;
33,723,596✔
3991
      }
3992

3993
      sdbRelease(pSdb, pStb);
2,012,827✔
3994
    }
3995

3996
    if (pDb != NULL) {
983,856✔
3997
      mndReleaseDb(pMnode, pDb);
55,117✔
3998
    }
3999
  }
4000

4001
  mDebug("mndRetrieveStbCol success, rows:%d, pShow->numOfRows:%d", numOfRows, pShow->numOfRows);
984,188✔
4002
  goto _OVER;
984,188✔
4003

4004
_ERROR:
4005
  mError("failed to mndRetrieveStbCol, rows:%d, pShow->numOfRows:%d, at %s:%d since %s", numOfRows, pShow->numOfRows,
4006
         __FUNCTION__, lino, tstrerror(code));
4007

4008
_OVER:
984,188✔
4009
  pShow->numOfRows += numOfRows;
984,188✔
4010
  return numOfRows;
984,188✔
4011
}
4012

4013
static void mndCancelGetNextStb(SMnode *pMnode, void *pIter) {
166✔
4014
  SSdb *pSdb = pMnode->pSdb;
166✔
4015
  sdbCancelFetchByType(pSdb, pIter, SDB_STB);
166✔
4016
}
166✔
4017

4018
const char *mndGetStbStr(const char *src) {
×
4019
  char *posDb = strstr(src, TS_PATH_DELIMITER);
×
4020
  if (posDb != NULL) ++posDb;
×
4021
  if (posDb == NULL) return src;
×
4022

4023
  char *posStb = strstr(posDb, TS_PATH_DELIMITER);
×
4024
  if (posStb != NULL) ++posStb;
×
4025
  if (posStb == NULL) return posDb;
×
4026
  return posStb;
×
4027
}
4028

4029
static int32_t mndCheckIndexReq(SCreateTagIndexReq *pReq) {
×
4030
  // impl
4031
  return TSDB_CODE_SUCCESS;
×
4032
}
4033

4034
/*int32_t mndAddIndexImpl(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp, void *sql,
4035
                        int32_t len) {
4036
  // impl later
4037
  int32_t code = 0;
4038
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "create-stb-index");
4039
  if (pTrans == NULL) goto _OVER;
4040

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

4045
  if (mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb) != 0) goto _OVER;
4046
  if (mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb) != 0) goto _OVER;
4047
  if (mndSetAlterStbRedoActions2(pMnode, pTrans, pDb, pStb, sql, len) != 0) goto _OVER;
4048
  if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
4049

4050
  return code;
4051

4052
_OVER:
4053
  mndTransDrop(pTrans);
4054
  return code;
4055
}
4056
static int32_t mndAddIndex(SMnode *pMnode, SRpcMsg *pReq, SCreateTagIndexReq *tagIdxReq, SDbObj *pDb, SStbObj *pOld) {
4057
  bool    needRsp = true;
4058
  int32_t code = -1;
4059
  SField *pField0 = NULL;
4060

4061
  SStbObj  stbObj = {0};
4062
  SStbObj *pNew = &stbObj;
4063

4064
  taosRLockLatch(&pOld->lock);
4065
  memcpy(&stbObj, pOld, sizeof(SStbObj));
4066
  taosRUnLockLatch(&pOld->lock);
4067

4068
  stbObj.pColumns = NULL;
4069
  stbObj.pTags = NULL;
4070
  stbObj.updateTime = taosGetTimestampMs();
4071
  stbObj.lock = 0;
4072

4073
  int32_t tag = mndFindSuperTableTagIndex(pOld, tagIdxReq->colName);
4074
  if (tag < 0) {
4075
    terrno = TSDB_CODE_MND_TAG_NOT_EXIST;
4076
    return -1;
4077
  }
4078
  if (mndAllocStbSchemas(pOld, pNew) != 0) {
4079
    return -1;
4080
  }
4081

4082
  SSchema *pTag = pNew->pTags + tag;
4083
  if (IS_IDX_ON(pTag)) {
4084
    terrno = TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST;
4085
    return -1;
4086
  } else {
4087
    pTag->flags |= COL_IDX_ON;
4088
  }
4089
  pNew->tagVer++;
4090

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

4093
  return code;
4094
}
4095
static int32_t mndProcessCreateIndexReq(SRpcMsg *pReq) {
4096
  SMnode            *pMnode = pReq->info.node;
4097
  int32_t            code = -1;
4098
  SDbObj            *pDb = NULL;
4099
  SStbObj           *pStb = NULL;
4100
  SCreateTagIndexReq tagIdxReq = {0};
4101

4102
  if (tDeserializeSCreateTagIdxReq(pReq->pCont, pReq->contLen, &tagIdxReq) != 0) {
4103
    terrno = TSDB_CODE_INVALID_MSG;
4104
    goto _OVER;
4105
  }
4106

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

4109
  if (mndCheckIndexReq(&tagIdxReq) != TSDB_CODE_SUCCESS) {
4110
    goto _OVER;
4111
  }
4112

4113
  pDb = mndAcquireDbByStb(pMnode, tagIdxReq.dbFName);
4114
  if (pDb == NULL) {
4115
    terrno = TSDB_CODE_MND_DB_NOT_EXIST;
4116
    goto _OVER;
4117
  }
4118

4119
  pStb = mndAcquireStb(pMnode, tagIdxReq.stbName);
4120
  if (pStb == NULL) {
4121
    terrno = TSDB_CODE_MND_STB_NOT_EXIST;
4122
    goto _OVER;
4123
  }
4124
  if (mndCheckDbPrivilege(pMnode, RPC_MSG_USER(pReq), RPC_MSG_TOKEN(pReq), MND_OPER_WRITE_DB, pDb) != 0) {
4125
    goto _OVER;
4126
  }
4127

4128
  code = mndAddIndex(pMnode, pReq, &tagIdxReq, pDb, pStb);
4129
  if (terrno == TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST || terrno == TSDB_CODE_MND_TAG_NOT_EXIST) {
4130
    return terrno;
4131
  } else {
4132
    if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
4133
  }
4134
_OVER:
4135
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
4136
    mError("stb:%s, failed to create index since %s", tagIdxReq.stbName, terrstr());
4137
  }
4138
  mndReleaseStb(pMnode, pStb);
4139
  mndReleaseDb(pMnode, pDb);
4140
  return code;
4141
}
4142
static int32_t mndProcessDropIndexReq(SRpcMsg *pReq) {
4143
  SMnode          *pMnode = pReq->info.node;
4144
  int32_t          code = -1;
4145
  SDbObj          *pDb = NULL;
4146
  SStbObj         *pStb = NULL;
4147
  SDropTagIndexReq dropReq = {0};
4148
  if (tDeserializeSDropTagIdxReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
4149
    terrno = TSDB_CODE_INVALID_MSG;
4150
    goto _OVER;
4151
  }
4152
  //
4153
  return TSDB_CODE_SUCCESS;
4154
_OVER:
4155
  return code;
4156
}*/
4157

4158
static int32_t mndProcessDropStbReqFromMNode(SRpcMsg *pReq) {
2,626✔
4159
  int32_t code = mndProcessDropStbReq(pReq);
2,626✔
4160
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
2,626✔
4161
    pReq->info.rsp = rpcMallocCont(1);
×
4162
    pReq->info.rspLen = 1;
×
4163
    pReq->info.noResp = false;
×
4164
    pReq->code = code;
×
4165
  }
4166
  return code;
2,626✔
4167
}
4168

4169
typedef struct SVDropTbVgReqs {
4170
  SArray     *pBatchReqs;
4171
  SVgroupInfo info;
4172
} SVDropTbVgReqs;
4173

4174
typedef struct SMDropTbDbInfo {
4175
  SArray *dbVgInfos;
4176
  int32_t hashPrefix;
4177
  int32_t hashSuffix;
4178
  int32_t hashMethod;
4179
} SMDropTbDbInfo;
4180

4181
typedef struct SMDropTbTsmaInfo {
4182
  char           tsmaResTbDbFName[TSDB_DB_FNAME_LEN];
4183
  char           tsmaResTbNamePrefix[TSDB_TABLE_FNAME_LEN];
4184
  int32_t        suid;
4185
  SMDropTbDbInfo dbInfo;  // reference to DbInfo in pDbMap
4186
} SMDropTbTsmaInfo;
4187

4188
typedef struct SMDropTbTsmaInfos {
4189
  SArray *pTsmaInfos;  // SMDropTbTsmaInfo
4190
} SMDropTbTsmaInfos;
4191

4192
typedef struct SMndDropTbsWithTsmaCtx {
4193
  SHashObj *pVgMap;  // <vgId, SVDropTbVgReqs>
4194
} SMndDropTbsWithTsmaCtx;
4195

4196
static int32_t mndDropTbForSingleVg(SMnode *pMnode, SMndDropTbsWithTsmaCtx *pCtx, SArray *pTbs, int32_t vgId);
4197

4198
static void destroySVDropTbBatchReqs(void *p);
4199
static void mndDestroyDropTbsWithTsmaCtx(SMndDropTbsWithTsmaCtx *p) {
12,453✔
4200
  if (!p) return;
12,453✔
4201

4202
  if (p->pVgMap) {
12,453✔
4203
    void *pIter = taosHashIterate(p->pVgMap, NULL);
12,453✔
4204
    while (pIter) {
24,906✔
4205
      SVDropTbVgReqs *pReqs = pIter;
12,453✔
4206
      taosArrayDestroyEx(pReqs->pBatchReqs, destroySVDropTbBatchReqs);
12,453✔
4207
      pIter = taosHashIterate(p->pVgMap, pIter);
12,453✔
4208
    }
4209
    taosHashCleanup(p->pVgMap);
12,453✔
4210
  }
4211
  taosMemoryFree(p);
12,453✔
4212
}
4213

4214
static int32_t mndInitDropTbsWithTsmaCtx(SMndDropTbsWithTsmaCtx **ppCtx) {
12,453✔
4215
  int32_t                 code = 0;
12,453✔
4216
  SMndDropTbsWithTsmaCtx *pCtx = taosMemoryCalloc(1, sizeof(SMndDropTbsWithTsmaCtx));
12,453✔
4217
  if (!pCtx) return terrno;
12,453✔
4218

4219
  pCtx->pVgMap = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_NO_LOCK);
12,453✔
4220
  if (!pCtx->pVgMap) {
12,453✔
4221
    code = terrno;
×
4222
    goto _end;
×
4223
  }
4224

4225
  *ppCtx = pCtx;
12,453✔
4226
_end:
12,453✔
4227
  if (code) mndDestroyDropTbsWithTsmaCtx(pCtx);
12,453✔
4228
  return code;
12,453✔
4229
}
4230

4231
static void *mndBuildVDropTbsReq(SMnode *pMnode, const SVgroupInfo *pVgInfo, const SVDropTbBatchReq *pReq,
36,012✔
4232
                                 int32_t *len) {
4233
  int32_t   contLen = 0;
36,012✔
4234
  int32_t   ret = 0;
36,012✔
4235
  SMsgHead *pHead = NULL;
36,012✔
4236
  SEncoder  encoder = {0};
36,012✔
4237

4238
  tEncodeSize(tEncodeSVDropTbBatchReq, pReq, contLen, ret);
36,012✔
4239
  if (ret < 0) return NULL;
36,012✔
4240

4241
  contLen += sizeof(SMsgHead);
36,012✔
4242
  pHead = taosMemoryMalloc(contLen);
36,012✔
4243
  if (pHead == NULL) {
36,012✔
4244
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
4245
    return NULL;
×
4246
  }
4247

4248
  pHead->contLen = htonl(contLen);
36,012✔
4249
  pHead->vgId = htonl(pVgInfo->vgId);
36,012✔
4250

4251
  void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
36,012✔
4252

4253
  tEncoderInit(&encoder, pBuf, contLen - sizeof(SMsgHead));
36,012✔
4254
  int32_t code = tEncodeSVDropTbBatchReq(&encoder, pReq);
36,012✔
4255
  tEncoderClear(&encoder);
36,012✔
4256
  if (code != 0) return NULL;
36,012✔
4257

4258
  *len = contLen;
36,012✔
4259
  return pHead;
36,012✔
4260
}
4261

4262
static int32_t mndSetDropTbsRedoActions(SMnode *pMnode, STrans *pTrans, const SVDropTbVgReqs *pVgReqs, void *pCont,
36,012✔
4263
                                        int32_t contLen, tmsg_t msgType) {
4264
  STransAction action = {0};
36,012✔
4265
  action.epSet = pVgReqs->info.epSet;
36,012✔
4266
  action.pCont = pCont;
36,012✔
4267
  action.contLen = contLen;
36,012✔
4268
  action.msgType = msgType;
36,012✔
4269
  action.acceptableCode = TSDB_CODE_TDB_TABLE_NOT_EXIST;
36,012✔
4270
  return mndTransAppendRedoAction(pTrans, &action);
36,012✔
4271
}
4272

4273
static int32_t mndBuildDropTbRedoActions(SMnode *pMnode, STrans *pTrans, SHashObj *pVgMap, tmsg_t msgType) {
9,003✔
4274
  int32_t code = 0;
9,003✔
4275
  void   *pIter = taosHashIterate(pVgMap, NULL);
9,003✔
4276
  while (pIter) {
18,006✔
4277
    const SVDropTbVgReqs *pVgReqs = pIter;
9,003✔
4278
    int32_t               len = 0;
9,003✔
4279
    for (int32_t i = 0; i < taosArrayGetSize(pVgReqs->pBatchReqs) && code == TSDB_CODE_SUCCESS; ++i) {
45,015✔
4280
      SVDropTbBatchReq *pBatchReq = taosArrayGet(pVgReqs->pBatchReqs, i);
36,012✔
4281
      void             *p = mndBuildVDropTbsReq(pMnode, &pVgReqs->info, pBatchReq, &len);
36,012✔
4282
      if (!p) {
36,012✔
4283
        code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
4284
        if (terrno != 0) code = terrno;
×
4285
        break;
×
4286
      }
4287
      if ((code = mndSetDropTbsRedoActions(pMnode, pTrans, pVgReqs, p, len, msgType)) != 0) {
36,012✔
4288
        break;
×
4289
      }
4290
    }
4291
    if (TSDB_CODE_SUCCESS != code) {
9,003✔
4292
      taosHashCancelIterate(pVgMap, pIter);
×
4293
      break;
×
4294
    }
4295
    pIter = taosHashIterate(pVgMap, pIter);
9,003✔
4296
  }
4297
  return code;
9,003✔
4298
}
4299

4300
static int32_t mndCreateDropTbsTxnPrepare(SRpcMsg *pRsp, SMndDropTbsWithTsmaCtx *pCtx) {
12,453✔
4301
  int32_t code = 0;
12,453✔
4302
  SMnode *pMnode = pRsp->info.node;
12,453✔
4303
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, pRsp, "drop-tbs");
12,453✔
4304
  mndTransSetChangeless(pTrans);
12,453✔
4305
  mndTransSetSerial(pTrans);
12,453✔
4306
  if (pTrans == NULL) {
12,453✔
4307
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
4308
    if (terrno != 0) code = terrno;
×
4309
    goto _OVER;
×
4310
  }
4311

4312
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
12,453✔
4313

4314
  if ((code = mndBuildDropTbRedoActions(pMnode, pTrans, pCtx->pVgMap, TDMT_VND_DROP_TABLE)) != 0) goto _OVER;
9,003✔
4315
  if ((code = mndTransPrepare(pMnode, pTrans)) != 0) goto _OVER;
9,003✔
4316

4317
_OVER:
9,003✔
4318
  mndTransDrop(pTrans);
12,453✔
4319
  TAOS_RETURN(code);
12,453✔
4320
}
4321

4322
static int32_t mndProcessDropTbWithTsma(SRpcMsg *pReq) {
×
4323
  int32_t      code = -1;
×
4324
  SMnode      *pMnode = pReq->info.node;
×
4325
  SDbObj      *pDb = NULL;
×
4326
  SStbObj     *pStb = NULL;
×
4327
  SMDropTbsReq dropReq = {0};
×
4328
  bool         locked = false;
×
4329
  if (tDeserializeSMDropTbsReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
×
4330
    code = TSDB_CODE_INVALID_MSG;
×
4331
    goto _OVER;
×
4332
  }
4333

4334
  SMndDropTbsWithTsmaCtx *pCtx = NULL;
×
4335
  code = mndInitDropTbsWithTsmaCtx(&pCtx);
×
4336
  if (code) goto _OVER;
×
4337
  for (int32_t i = 0; i < dropReq.pVgReqs->size; ++i) {
×
4338
    SMDropTbReqsOnSingleVg *pReq = taosArrayGet(dropReq.pVgReqs, i);
×
4339
    code = mndDropTbForSingleVg(pMnode, pCtx, pReq->pTbs, pReq->vgInfo.vgId);
×
4340
    if (code) goto _OVER;
×
4341
  }
4342
  code = mndCreateDropTbsTxnPrepare(pReq, pCtx);
×
4343
  if (code == 0) {
×
4344
    code = TSDB_CODE_ACTION_IN_PROGRESS;
×
4345
  }
4346
_OVER:
×
4347
  tFreeSMDropTbsReq(&dropReq);
×
4348
  if (pCtx) mndDestroyDropTbsWithTsmaCtx(pCtx);
×
4349
  TAOS_RETURN(code);
×
4350
}
4351

4352
static int32_t createDropTbBatchReq(const SVDropTbReq *pReq, SVDropTbBatchReq *pBatchReq) {
51,192✔
4353
  pBatchReq->nReqs = 1;
51,192✔
4354
  pBatchReq->pArray = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SVDropTbReq));
51,192✔
4355
  if (!pBatchReq->pArray) return terrno;
51,192✔
4356
  if (taosArrayPush(pBatchReq->pArray, pReq) == NULL) {
102,384✔
4357
    taosArrayDestroy(pBatchReq->pArray);
×
4358
    pBatchReq->pArray = NULL;
×
4359
    return terrno;
×
4360
  }
4361
  return TSDB_CODE_SUCCESS;
51,192✔
4362
}
4363

4364
static void destroySVDropTbBatchReqs(void *p) {
51,192✔
4365
  SVDropTbBatchReq *pReq = p;
51,192✔
4366
  taosArrayDestroy(pReq->pArray);
51,192✔
4367
  pReq->pArray = NULL;
51,192✔
4368
}
51,192✔
4369

4370
static int32_t mndDropTbAdd(SMnode *pMnode, SHashObj *pVgHashMap, const SVgroupInfo *pVgInfo, char *name, tb_uid_t suid,
51,192✔
4371
                            bool ignoreNotExists) {
4372
  SVDropTbReq req = {.name = name, .suid = suid, .igNotExists = ignoreNotExists, .uid = 0};
51,192✔
4373

4374
  SVDropTbVgReqs *pVgReqs = taosHashGet(pVgHashMap, &pVgInfo->vgId, sizeof(pVgInfo->vgId));
51,192✔
4375
  SVDropTbVgReqs  vgReqs = {0};
51,192✔
4376
  if (pVgReqs == NULL) {
51,192✔
4377
    vgReqs.info = *pVgInfo;
12,453✔
4378
    vgReqs.pBatchReqs = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SVDropTbBatchReq));
12,453✔
4379
    if (!vgReqs.pBatchReqs) return terrno;
12,453✔
4380
    SVDropTbBatchReq batchReq = {0};
12,453✔
4381
    int32_t          code = createDropTbBatchReq(&req, &batchReq);
12,453✔
4382
    if (TSDB_CODE_SUCCESS != code) return code;
12,453✔
4383
    if (taosArrayPush(vgReqs.pBatchReqs, &batchReq) == NULL) {
24,906✔
4384
      taosArrayDestroy(batchReq.pArray);
×
4385
      return terrno;
×
4386
    }
4387
    if (taosHashPut(pVgHashMap, &pVgInfo->vgId, sizeof(pVgInfo->vgId), &vgReqs, sizeof(vgReqs)) != 0) {
12,453✔
4388
      taosArrayDestroyEx(vgReqs.pBatchReqs, destroySVDropTbBatchReqs);
×
4389
      return terrno;
×
4390
    }
4391
  } else {
4392
    SVDropTbBatchReq batchReq = {0};
38,739✔
4393
    int32_t          code = createDropTbBatchReq(&req, &batchReq);
38,739✔
4394
    if (TSDB_CODE_SUCCESS != code) return code;
38,739✔
4395
    if (taosArrayPush(pVgReqs->pBatchReqs, &batchReq) == NULL) {
77,478✔
4396
      taosArrayDestroy(batchReq.pArray);
×
4397
      return terrno;
×
4398
    }
4399
  }
4400
  return 0;
51,192✔
4401
}
4402

4403
static int32_t mndDropTbForSingleVg(SMnode *pMnode, SMndDropTbsWithTsmaCtx *pCtx, SArray *pTbs, int32_t vgId) {
12,453✔
4404
  int32_t code = 0;
12,453✔
4405

4406
  SVgObj *pVgObj = mndAcquireVgroup(pMnode, vgId);
12,453✔
4407
  if (!pVgObj) {
12,453✔
4408
    code = 0;
×
4409
    goto _end;
×
4410
  }
4411
  SVgroupInfo vgInfo = {.hashBegin = pVgObj->hashBegin,
24,906✔
4412
                        .hashEnd = pVgObj->hashEnd,
12,453✔
4413
                        .numOfTable = pVgObj->numOfTables,
12,453✔
4414
                        .vgId = pVgObj->vgId};
12,453✔
4415
  vgInfo.epSet = mndGetVgroupEpset(pMnode, pVgObj);
12,453✔
4416
  mndReleaseVgroup(pMnode, pVgObj);
12,453✔
4417

4418
  for (int32_t i = 0; i < pTbs->size; ++i) {
63,645✔
4419
    SVDropTbReq *pTb = taosArrayGet(pTbs, i);
51,192✔
4420
    TAOS_CHECK_GOTO(mndDropTbAdd(pMnode, pCtx->pVgMap, &vgInfo, pTb->name, pTb->suid, pTb->igNotExists), NULL, _end);
51,192✔
4421
  }
4422
_end:
12,453✔
4423
  return code;
12,453✔
4424
}
4425

4426
static int32_t mndProcessFetchTtlExpiredTbs(SRpcMsg *pRsp) {
13,590,499✔
4427
  int32_t                 code = -1;
13,590,499✔
4428
  SDecoder                decoder = {0};
13,590,499✔
4429
  SMnode                 *pMnode = pRsp->info.node;
13,590,499✔
4430
  SVFetchTtlExpiredTbsRsp rsp = {0};
13,590,499✔
4431
  SMndDropTbsWithTsmaCtx *pCtx = NULL;
13,590,499✔
4432
  if (pRsp->code != TSDB_CODE_SUCCESS) {
13,590,499✔
4433
    code = pRsp->code;
159,895✔
4434
    goto _end;
159,895✔
4435
  }
4436
  if (pRsp->contLen == 0) {
13,430,604✔
4437
    code = 0;
13,418,151✔
4438
    goto _end;
13,418,151✔
4439
  }
4440

4441
  tDecoderInit(&decoder, pRsp->pCont, pRsp->contLen);
12,453✔
4442
  code = tDecodeVFetchTtlExpiredTbsRsp(&decoder, &rsp);
12,453✔
4443
  if (code) goto _end;
12,453✔
4444

4445
  code = mndInitDropTbsWithTsmaCtx(&pCtx);
12,453✔
4446
  if (code) goto _end;
12,453✔
4447

4448
  code = mndDropTbForSingleVg(pMnode, pCtx, rsp.pExpiredTbs, rsp.vgId);
12,453✔
4449
  if (code) goto _end;
12,453✔
4450
  code = mndCreateDropTbsTxnPrepare(pRsp, pCtx);
12,453✔
4451
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
12,453✔
4452
_end:
13,589,383✔
4453
  if (pCtx) mndDestroyDropTbsWithTsmaCtx(pCtx);
13,590,499✔
4454
  tDecoderClear(&decoder);
13,590,499✔
4455
  tFreeFetchTtlExpiredTbsRsp(&rsp);
13,590,499✔
4456
  TAOS_RETURN(code);
13,590,499✔
4457
}
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