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

taosdata / TDengine / #5011

03 Apr 2026 03:59PM UTC coverage: 72.3% (+0.008%) from 72.292%
#5011

push

travis-ci

web-flow
merge: from main to 3.0 branch #35067

4053 of 5985 new or added lines in 68 files covered. (67.72%)

732 existing lines in 143 files now uncovered.

257430 of 356056 relevant lines covered (72.3%)

131834103.52 hits per line

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

78.06
/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) {
457,534✔
73
  SSdbTable table = {
457,534✔
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);
457,534✔
84
  mndSetMsgHandle(pMnode, TDMT_MND_ALTER_STB, mndProcessAlterStbReq);
457,534✔
85
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_STB, mndProcessDropStbReq);
457,534✔
86
  mndSetMsgHandle(pMnode, TDMT_VND_CREATE_STB_RSP, mndTransProcessRsp);
457,534✔
87
  mndSetMsgHandle(pMnode, TDMT_VND_DROP_TTL_TABLE_RSP, mndProcessDropTtltbRsp);
457,534✔
88
  mndSetMsgHandle(pMnode, TDMT_VND_TRIM_RSP, mndTransProcessRsp);
457,534✔
89
  mndSetMsgHandle(pMnode, TDMT_VND_TRIM_WAL_RSP, mndProcessTrimDbWalRsp);
457,534✔
90
  mndSetMsgHandle(pMnode, TDMT_VND_ALTER_STB_RSP, mndTransProcessRsp);
457,534✔
91
  mndSetMsgHandle(pMnode, TDMT_VND_DROP_STB_RSP, mndTransProcessRsp);
457,534✔
92
  mndSetMsgHandle(pMnode, TDMT_MND_TABLE_META, mndProcessTableMetaReq);
457,534✔
93
  mndSetMsgHandle(pMnode, TDMT_MND_TTL_TIMER, mndProcessTtlTimer);
457,534✔
94
  // mndSetMsgHandle(pMnode, TDMT_MND_TRIM_DB_TIMER, mndProcessTrimDbTimer);
95
  mndSetMsgHandle(pMnode, TDMT_MND_TABLE_CFG, mndProcessTableCfgReq);
457,534✔
96
  mndSetMsgHandle(pMnode, TDMT_MND_STB_DROP, mndProcessDropStbReqFromMNode);
457,534✔
97
  mndSetMsgHandle(pMnode, TDMT_MND_STB_DROP_RSP, mndTransProcessRsp);
457,534✔
98
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_TB_WITH_TSMA, mndProcessDropTbWithTsma);
457,534✔
99
  mndSetMsgHandle(pMnode, TDMT_VND_FETCH_TTL_EXPIRED_TBS_RSP, mndProcessFetchTtlExpiredTbs);
457,534✔
100
  mndSetMsgHandle(pMnode, TDMT_VND_DROP_TABLE_RSP, mndTransProcessRsp);
457,534✔
101
  mndSetMsgHandle(pMnode, TDMT_VND_CREATE_TABLE_RSP, mndTransProcessRsp);
457,534✔
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);
457,534✔
110

111
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STB, mndRetrieveStb);
457,534✔
112
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_STB, mndCancelGetNextStb);
457,534✔
113

114
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_COL, mndRetrieveStbCol);
457,534✔
115
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_COL, mndCancelGetNextStb);
457,534✔
116

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

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

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

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

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

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

167
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
102,563,141✔
168
    SSchema *pSchema = &pStb->pTags[i];
86,950,470✔
169
    SDB_SET_INT8(pRaw, dataPos, pSchema->type, _OVER)
86,950,470✔
170
    SDB_SET_INT8(pRaw, dataPos, pSchema->flags, _OVER)
86,950,470✔
171
    SDB_SET_INT16(pRaw, dataPos, pSchema->colId, _OVER)
86,950,470✔
172
    SDB_SET_INT32(pRaw, dataPos, pSchema->bytes, _OVER)
86,950,470✔
173
    SDB_SET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
86,950,470✔
174
  }
175

176
  for (int32_t i = 0; i < pStb->numOfFuncs; ++i) {
15,612,671✔
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) {
15,612,671✔
182
    SDB_SET_BINARY(pRaw, dataPos, pStb->comment, pStb->commentLen + 1, _OVER)
64,642✔
183
  }
184

185
  if (pStb->ast1Len > 0) {
15,612,671✔
186
    SDB_SET_BINARY(pRaw, dataPos, pStb->pAst1, pStb->ast1Len, _OVER)
×
187
  }
188

189
  if (pStb->ast2Len > 0) {
15,612,671✔
190
    SDB_SET_BINARY(pRaw, dataPos, pStb->pAst2, pStb->ast2Len, _OVER)
×
191
  }
192

193
  if (pStb->pCmpr != NULL) {
15,612,671✔
194
    for (int i = 0; i < pStb->numOfColumns; i++) {
938,092,846✔
195
      SColCmpr *p = &pStb->pCmpr[i];
922,480,175✔
196
      SDB_SET_INT16(pRaw, dataPos, p->id, _OVER)
922,480,175✔
197
      SDB_SET_INT32(pRaw, dataPos, p->alg, _OVER)
922,480,175✔
198
    }
199
  }
200
  SDB_SET_INT64(pRaw, dataPos, pStb->keep, _OVER)
15,612,671✔
201

202
  if (hasTypeMod) {
15,612,671✔
203
    for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
572,725,388✔
204
      SDB_SET_INT32(pRaw, dataPos, pStb->pExtSchemas[i].typeMod, _OVER);
567,640,257✔
205
    }
206
  }
207

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

216
  terrno = 0;
15,612,671✔
217

218
_OVER:
15,612,671✔
219
  if (terrno != 0) {
15,612,671✔
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);
15,612,671✔
226
  return pRaw;
15,612,671✔
227
}
228

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

237
  int8_t sver = 0;
14,680,929✔
238
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
14,680,929✔
239

240
  if (sver > STB_VER_NUMBER) {
14,680,929✔
241
    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
×
242
    goto _OVER;
×
243
  }
244

245
  pRow = sdbAllocRow(sizeof(SStbObj));
14,680,929✔
246
  if (pRow == NULL) goto _OVER;
14,680,929✔
247

248
  pStb = sdbGetRowObj(pRow);
14,680,929✔
249
  if (pStb == NULL) goto _OVER;
14,680,929✔
250

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

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

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

291
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
148,361,887✔
292
    SSchema *pSchema = &pStb->pTags[i];
133,680,958✔
293
    SDB_GET_INT8(pRaw, dataPos, &pSchema->type, _OVER)
133,680,958✔
294
    SDB_GET_INT8(pRaw, dataPos, &pSchema->flags, _OVER)
133,680,958✔
295
    SDB_GET_INT16(pRaw, dataPos, &pSchema->colId, _OVER)
133,680,958✔
296
    SDB_GET_INT32(pRaw, dataPos, &pSchema->bytes, _OVER)
133,680,958✔
297
    SDB_GET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
133,680,958✔
298
  }
299

300
  for (int32_t i = 0; i < pStb->numOfFuncs; ++i) {
14,680,929✔
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) {
14,680,929✔
307
    pStb->comment = taosMemoryCalloc(pStb->commentLen + 1, 1);
62,355✔
308
    if (pStb->comment == NULL) goto _OVER;
62,355✔
309
    SDB_GET_BINARY(pRaw, dataPos, pStb->comment, pStb->commentLen + 1, _OVER)
62,355✔
310
  }
311

312
  if (pStb->ast1Len > 0) {
14,680,929✔
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) {
14,680,929✔
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));
14,680,929✔
325
  if (sver < STB_VER_SUPPORT_COMP) {
14,680,929✔
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,486,119,295✔
336
      SColCmpr *pCmpr = &pStb->pCmpr[i];
1,471,438,366✔
337
      SDB_GET_INT16(pRaw, dataPos, &pCmpr->id, _OVER)
1,471,438,366✔
338
      SDB_GET_INT32(pRaw, dataPos, (int32_t *)&pCmpr->alg, _OVER)  // compatiable
1,471,438,366✔
339
    }
340
  }
341
  SDB_GET_INT64(pRaw, dataPos, &pStb->keep, _OVER)
14,680,929✔
342

343
  // type mod
344
  if (hasExtSchemas) {
14,680,929✔
345
    pStb->pExtSchemas = taosMemoryCalloc(pStb->numOfColumns, sizeof(SExtSchema));
6,340,805✔
346
    if (!pStb->pExtSchemas) goto _OVER;
6,340,805✔
347
    for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
1,207,780,270✔
348
      SSchema *pSchema = &pStb->pColumns[i];
1,201,439,465✔
349
      SDB_GET_INT32(pRaw, dataPos, &pStb->pExtSchemas[i].typeMod, _OVER)
1,201,439,465✔
350
    }
351
  }
352

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

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

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

372
  SDB_GET_RESERVE(pRaw, dataPos, STB_RESERVE_SIZE, _OVER)
14,680,929✔
373

374
  terrno = 0;
14,680,929✔
375

376
_OVER:
14,680,929✔
377
  if (terrno != 0) {
14,680,929✔
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);
14,680,929✔
391
  return pRow;
14,680,929✔
392
}
393

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

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

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

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

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

431
  if (pOld->numOfTags < pNew->numOfTags) {
11,189,637✔
432
    void *pTags = taosMemoryMalloc(pNew->numOfTags * sizeof(SSchema));
288,787✔
433
    if (pTags == NULL) {
288,787✔
434
      goto END;
×
435
    }
436
    taosMemoryFree(pOld->pTags);
288,787✔
437
    pOld->pTags = pTags;
288,787✔
438
  }
439

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

450
  if (pOld->ast1Len < pNew->ast1Len) {
11,189,637✔
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) {
11,189,637✔
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;
11,189,637✔
469
  pOld->tagVer = pNew->tagVer;
11,189,637✔
470
  pOld->colVer = pNew->colVer;
11,189,637✔
471
  pOld->smaVer = pNew->smaVer;
11,189,637✔
472
  pOld->nextColId = pNew->nextColId;
11,189,637✔
473
  pOld->ttl = pNew->ttl;
11,189,637✔
474
  pOld->keep = pNew->keep;
11,189,637✔
475
  pOld->ownerId = pNew->ownerId;
11,189,637✔
476
  pOld->secureDelete = pNew->secureDelete;
11,189,637✔
477

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

509
  if (pNew->pExtSchemas) {
11,189,637✔
510
    taosMemoryFreeClear(pOld->pExtSchemas);
6,295,176✔
511
    pOld->pExtSchemas = taosMemoryCalloc(pNew->numOfColumns, sizeof(SExtSchema));
6,295,176✔
512
    if (pOld->pExtSchemas == NULL){
6,295,176✔
513
      goto END;
×
514
    }
515
    memcpy(pOld->pExtSchemas, pNew->pExtSchemas, pNew->numOfColumns * sizeof(SExtSchema));
6,295,176✔
516
  }
517

518
END:
4,894,461✔
519
  taosWUnLockLatch(&pOld->lock);
11,189,637✔
520
  return terrno;
11,189,637✔
521
}
522

523
SStbObj *mndAcquireStb(SMnode *pMnode, char *stbName) {
35,617,437✔
524
  SSdb    *pSdb = pMnode->pSdb;
35,617,437✔
525
  SStbObj *pStb = sdbAcquire(pSdb, SDB_STB, stbName);
35,617,437✔
526
  if (pStb == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
35,617,437✔
527
    terrno = TSDB_CODE_MND_STB_NOT_EXIST;
3,155,899✔
528
  }
529
  return pStb;
35,617,437✔
530
}
531

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

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

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

544
  return mndAcquireDb(pMnode, db);
8,171,238✔
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,
10,847,941✔
557
                            int32_t alterOriDataLen) {
558
  SEncoder       encoder = {0};
10,847,941✔
559
  int32_t        contLen;
560
  SName          name = {0};
10,847,941✔
561
  SVCreateStbReq req = {0};
10,847,941✔
562

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

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

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

593
  req.colCmpr.pColCmpr = taosMemoryCalloc(pCmpr->nCols, sizeof(SColCmpr));
10,847,941✔
594
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
901,801,957✔
595
    SColCmpr *p = &pCmpr->pColCmpr[i];
890,954,016✔
596
    p->alg = pStb->pCmpr[i].alg;
890,954,016✔
597
    p->id = pStb->pCmpr[i].id;
890,954,016✔
598
  }
599

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

608
  contLen += sizeof(SMsgHead);
10,847,941✔
609

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

616
  pHead->contLen = htonl(contLen);
10,847,941✔
617
  pHead->vgId = htonl(pVgroup->vgId);
10,847,941✔
618

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

628
  *pContLen = contLen;
10,847,941✔
629
  taosMemoryFreeClear(req.rsmaParam.name);
10,847,941✔
630
  taosMemoryFreeClear(req.rsmaParam.funcColIds);
10,847,941✔
631
  taosMemoryFreeClear(req.rsmaParam.funcIds);
10,847,941✔
632
  taosMemoryFreeClear(req.colCmpr.pColCmpr);
10,847,941✔
633
  return pHead;
10,847,941✔
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,289,900✔
643
  SName        name = {0};
5,289,900✔
644
  SVDropStbReq req = {0};
5,289,900✔
645
  int32_t      contLen = 0;
5,289,900✔
646
  int32_t      ret = 0;
5,289,900✔
647
  SMsgHead    *pHead = NULL;
5,289,900✔
648
  SEncoder     encoder = {0};
5,289,900✔
649

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

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

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

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

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

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

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

680
  *pContLen = contLen;
5,289,900✔
681
  return pHead;
5,289,900✔
682
}
683

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

691
  if (pCreate->virtualStb != 0 && pCreate->virtualStb != 1) {
1,996,822✔
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;
1,996,822✔
697
  if (pCreate->numOfColumns < TSDB_MIN_COLUMNS || pCreate->numOfTags + pCreate->numOfColumns > maxColumns) {
1,996,822✔
698
    code = TSDB_CODE_PAR_INVALID_COLUMNS_NUM;
×
699
    TAOS_RETURN(code);
×
700
  }
701

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

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

713
  for (int32_t i = 0; i < pCreate->numOfColumns; ++i) {
159,404,122✔
714
    SFieldWithOptions *pField1 = taosArrayGet(pCreate->pColumns, i);
157,407,300✔
715
    if (pField1->type >= TSDB_DATA_TYPE_MAX) {
157,407,300✔
716
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
717
      TAOS_RETURN(code);
×
718
    }
719
    if (pField1->bytes <= 0) {
157,407,300✔
720
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
721
      TAOS_RETURN(code);
×
722
    }
723
    if (pField1->name[0] == 0) {
157,407,300✔
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,321,699✔
730
    SField *pField1 = taosArrayGet(pCreate->pTags, i);
8,324,877✔
731
    if (pField1->type >= TSDB_DATA_TYPE_MAX) {
8,324,877✔
732
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
733
      TAOS_RETURN(code);
×
734
    }
735
    if (pField1->bytes <= 0) {
8,324,877✔
736
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
737
      TAOS_RETURN(code);
×
738
    }
739
    if (pField1->name[0] == 0) {
8,324,877✔
740
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
741
      TAOS_RETURN(code);
×
742
    }
743
  }
744

745
  TAOS_RETURN(code);
1,996,822✔
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) {
1,956,089✔
766
  int32_t  code = 0;
1,956,089✔
767
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
1,956,089✔
768
  if (pCommitRaw == NULL) {
1,956,089✔
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);
1,956,089✔
774
  if ((code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
1,956,089✔
775
    sdbFreeRaw(pCommitRaw);
×
776
    TAOS_RETURN(code);
×
777
  }
778
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
1,956,089✔
779

780
  TAOS_RETURN(code);
1,956,089✔
781
}
782

783
static int32_t mndSetCreateStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
1,954,374✔
784
  int32_t code = 0;
1,954,374✔
785
  SSdb   *pSdb = pMnode->pSdb;
1,954,374✔
786
  SVgObj *pVgroup = NULL;
1,954,374✔
787
  void   *pIter = NULL;
1,954,374✔
788
  int32_t contLen;
1,950,974✔
789

790
  while (1) {
8,569,411✔
791
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
10,523,785✔
792
    if (pIter == NULL) break;
10,523,785✔
793
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
8,569,411✔
794
      sdbRelease(pSdb, pVgroup);
4,209,372✔
795
      continue;
4,209,372✔
796
    }
797

798
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, NULL, 0);
4,360,039✔
799
    if (pReq == NULL) {
4,360,039✔
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,360,039✔
808
    action.mTraceId = pTrans->mTraceId;
4,360,039✔
809
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
4,360,039✔
810
    action.pCont = pReq;
4,360,039✔
811
    action.contLen = contLen;
4,360,039✔
812
    action.msgType = TDMT_VND_CREATE_STB;
4,360,039✔
813
    action.acceptableCode = TSDB_CODE_TDB_STB_ALREADY_EXIST;
4,360,039✔
814
    action.retryCode = TSDB_CODE_TDB_STB_NOT_EXIST;
4,360,039✔
815
    mInfo("trans:%d, add create stb to redo action", pTrans->id);
4,360,039✔
816
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
4,360,039✔
817
      taosMemoryFree(pReq);
×
818
      sdbCancelFetch(pSdb, pIter);
×
819
      sdbRelease(pSdb, pVgroup);
×
820
      TAOS_RETURN(code);
×
821
    }
822
    sdbRelease(pSdb, pVgroup);
4,360,039✔
823
  }
824

825
  TAOS_RETURN(code);
1,954,374✔
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) {
1,954,374✔
858
  int32_t code = 0;
1,954,374✔
859
  SSdb   *pSdb = pMnode->pSdb;
1,954,374✔
860
  SVgObj *pVgroup = NULL;
1,954,374✔
861
  void   *pIter = NULL;
1,954,374✔
862

863
  while (1) {
8,569,411✔
864
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
10,523,785✔
865
    if (pIter == NULL) break;
10,523,785✔
866
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
8,569,411✔
867
      sdbRelease(pSdb, pVgroup);
4,209,372✔
868
      continue;
4,209,372✔
869
    }
870

871
    int32_t contLen = 0;
4,360,039✔
872
    void   *pReq = mndBuildVDropStbReq(pMnode, pVgroup, pStb, &contLen);
4,360,039✔
873
    if (pReq == NULL) {
4,360,039✔
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,360,039✔
881
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
4,360,039✔
882
    action.pCont = pReq;
4,360,039✔
883
    action.contLen = contLen;
4,360,039✔
884
    action.msgType = TDMT_VND_DROP_STB;
4,360,039✔
885
    action.acceptableCode = TSDB_CODE_TDB_STB_NOT_EXIST;
4,360,039✔
886
    mInfo("trans:%d, add drop stb to undo action", pTrans->id);
4,360,039✔
887
    if ((code = mndTransAppendUndoAction(pTrans, &action)) != 0) {
4,360,039✔
888
      taosMemoryFree(pReq);
×
889
      sdbCancelFetch(pSdb, pIter);
×
890
      sdbRelease(pSdb, pVgroup);
×
891
      TAOS_RETURN(code);
×
892
    }
893
    sdbRelease(pSdb, pVgroup);
4,360,039✔
894
  }
895

896
  TAOS_RETURN(code);
1,954,374✔
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) {
1,960,707✔
910
  int32_t code = 0;
1,960,707✔
911
  bool    hasTypeMods = false;
1,960,707✔
912
  memcpy(pDst->name, pCreate->name, TSDB_TABLE_FNAME_LEN);
1,960,707✔
913
  memcpy(pDst->db, pDb->name, TSDB_DB_FNAME_LEN);
1,960,707✔
914
  pDst->createdTime = taosGetTimestampMs();
1,960,707✔
915
  pDst->updateTime = pDst->createdTime;
1,960,707✔
916
  pDst->uid = (pCreate->source == TD_REQ_FROM_TAOX_OLD || pCreate->source == TD_REQ_FROM_TAOX || pCreate->source == TD_REQ_FROM_SML)
5,875,321✔
917
                  ? pCreate->suid
918
                  : mndGenerateUid(pCreate->name, TSDB_TABLE_FNAME_LEN);
3,921,414✔
919
  pDst->dbUid = pDb->uid;
1,960,707✔
920
  pDst->tagVer = 1;
1,960,707✔
921
  pDst->colVer = 1;
1,960,707✔
922
  pDst->smaVer = 1;
1,960,707✔
923
  pDst->nextColId = 1;
1,960,707✔
924
  pDst->maxdelay[0] = pCreate->delay1;
1,960,707✔
925
  pDst->maxdelay[1] = pCreate->delay2;
1,960,707✔
926
  pDst->watermark[0] = pCreate->watermark1;
1,960,707✔
927
  pDst->watermark[1] = pCreate->watermark2;
1,960,707✔
928
  pDst->ttl = pCreate->ttl;
1,960,707✔
929
  pDst->numOfColumns = pCreate->numOfColumns;
1,960,707✔
930
  pDst->numOfTags = pCreate->numOfTags;
1,960,707✔
931
  pDst->numOfFuncs = pCreate->numOfFuncs;
1,960,707✔
932
  pDst->commentLen = pCreate->commentLen;
1,960,707✔
933
  pDst->pFuncs = pCreate->pFuncs;
1,960,707✔
934
  pDst->source = pCreate->source;
1,960,707✔
935
  pDst->keep = pCreate->keep;
1,960,707✔
936
  pDst->virtualStb = pCreate->virtualStb;
1,960,707✔
937
  pDst->secureDelete = pCreate->secureDelete;
1,960,707✔
938
  pCreate->pFuncs = NULL;
1,960,707✔
939

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

949
  pDst->ast1Len = pCreate->ast1Len;
1,960,707✔
950
  if (pDst->ast1Len > 0) {
1,960,707✔
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;
1,960,707✔
960
  if (pDst->ast2Len > 0) {
1,960,707✔
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));
1,960,707✔
970
  pDst->pTags = taosMemoryCalloc(1, pDst->numOfTags * sizeof(SSchema));
1,960,707✔
971
  if (pDst->pColumns == NULL || pDst->pTags == NULL) {
1,960,707✔
972
    code = terrno;
×
973
    TAOS_RETURN(code);
×
974
  }
975

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

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

993
  for (int32_t i = 0; i < pDst->numOfTags; ++i) {
10,073,737✔
994
    SField  *pField = taosArrayGet(pCreate->pTags, i);
8,114,170✔
995
    SSchema *pSchema = &pDst->pTags[i];
8,114,170✔
996
    pSchema->type = pField->type;
8,114,170✔
997
    pSchema->bytes = pField->bytes;
8,114,170✔
998
    if (i == 0) {
8,114,170✔
999
      SSCHMEA_SET_IDX_ON(pSchema);
1,959,567✔
1000
    }
1001
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
8,114,170✔
1002
    pSchema->colId = pDst->nextColId;
8,114,170✔
1003
    pDst->nextColId++;
8,114,170✔
1004
  }
1005
  // set col compress
1006
  pDst->pCmpr = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SCmprObj));
1,959,567✔
1007
  for (int32_t i = 0; i < pDst->numOfColumns; i++) {
121,781,184✔
1008
    SFieldWithOptions *pField = taosArrayGet(pCreate->pColumns, i);
119,821,617✔
1009
    SSchema           *pSchema = &pDst->pColumns[i];
119,821,617✔
1010

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

1016
  if (hasTypeMods) {
1,959,567✔
1017
    pDst->pExtSchemas = taosMemoryCalloc(pDst->numOfColumns, sizeof(SExtSchema));
19,082✔
1018
    if (!pDst->pExtSchemas) {
19,082✔
1019
      code = terrno;
×
1020
      TAOS_RETURN(code);
×
1021
    }
1022
    for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
317,456✔
1023
      SFieldWithOptions * pField = taosArrayGet(pCreate->pColumns, i);
298,374✔
1024
      pDst->pExtSchemas[i].typeMod = pField->typeMod;
298,374✔
1025
    }
1026
  }
1027
  TAOS_RETURN(code);
1,959,567✔
1028
}
1029
int32_t mndGenIdxNameForFirstTag(char *fullname, char *dbname, char *stbname, char *tagname) {
1,891,921✔
1030
  SName name = {0};
1,891,921✔
1031
  if ((terrno = tNameFromString(&name, stbname, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0) {
1,891,921✔
1032
    return -1;
×
1033
  }
1034
  return snprintf(fullname, TSDB_INDEX_FNAME_LEN, "%s.%s_%s", dbname, tagname, tNameGetTableName(&name));
1,891,921✔
1035
}
1036

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

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

1043
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_DB_INSIDE, pReq, "create-stb");
1,891,346✔
1044
  if (pTrans == NULL) {
1,891,346✔
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,891,346✔
1051
  TAOS_CHECK_GOTO(mndBuildStbFromReq(pMnode, &stbObj, pCreate, pDb), NULL, _OVER);
1,891,346✔
1052
  memcpy(stbObj.createUser, pOperUser->name, TSDB_USER_LEN);
1,890,206✔
1053
  stbObj.ownerId = pOperUser->uid;
1,890,206✔
1054

1055

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

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

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

1082
  TAOS_CHECK_GOTO(mndAddStbToTrans(pMnode, pTrans, pDb, &stbObj), NULL, _OVER);
1,890,206✔
1083
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
1,885,013✔
1084
  code = 0;
1,885,013✔
1085

1086
_OVER:
1,891,346✔
1087
  mndTransDrop(pTrans);
1,891,346✔
1088
  if (mndStbActionDelete(pMnode->pSdb, &stbObj) != 0) mError("failed to mndStbActionDelete");
1,891,346✔
1089
  TAOS_RETURN(code);
1,891,346✔
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) {
59✔
1112
  int32_t code = 0;
59✔
1113
  char   *name = AUDIT_STABLE_NAME;
59✔
1114
  (void)tsnprintf(pDst->name, TSDB_TABLE_FNAME_LEN, "%s.%s", pDb->name, name);
59✔
1115
  memcpy(pDst->db, pDb->name, TSDB_DB_FNAME_LEN);
59✔
1116
  pDst->createdTime = taosGetTimestampMs();
59✔
1117
  pDst->updateTime = pDst->createdTime;
59✔
1118
  pDst->uid = mndGenerateUid(pDst->name, strlen(pDst->name));
59✔
1119
  pDst->dbUid = pDb->uid;
59✔
1120
  pDst->tagVer = 1;
59✔
1121
  pDst->colVer = 1;
59✔
1122
  pDst->smaVer = 1;
59✔
1123
  pDst->nextColId = 1;
59✔
1124
  pDst->maxdelay[0] = -1;
59✔
1125
  pDst->maxdelay[1] = -1;
59✔
1126
  pDst->watermark[0] = 5000;
59✔
1127
  pDst->watermark[1] = 5000;
59✔
1128
  pDst->ttl = 0;
59✔
1129
  pDst->keep = -1;
59✔
1130
  pDst->source = 0;
59✔
1131
  pDst->virtualStb = 0;
59✔
1132
  pDst->numOfColumns = sizeof(audit_columns) / sizeof(AuditColumnDef);
59✔
1133
  pDst->numOfTags = 1;
59✔
1134
  pDst->numOfFuncs = 0;
59✔
1135
  pDst->commentLen = -1;
59✔
1136
  pDst->pFuncs = NULL;
59✔
1137

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

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

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

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

1169
  // tag
1170
  pSchema = &pDst->pTags[0];
59✔
1171
  pSchema->type = TSDB_DATA_TYPE_VARCHAR;
59✔
1172
  pSchema->bytes = 64 + VARSTR_HEADER_SIZE;
59✔
1173
  SSCHMEA_SET_IDX_ON(pSchema);
59✔
1174
  tstrncpy(pSchema->name, "cluster_id", TSDB_COL_NAME_LEN);
59✔
1175
  pSchema->colId = pDst->nextColId;
59✔
1176
  pDst->nextColId++;
59✔
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);
59✔
1192
}
1193

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

1199
  int32_t contLen;
59✔
1200

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

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

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

1227
  TAOS_RETURN(code);
59✔
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) {
59✔
1233
  SStbObj stbObj = {0};
59✔
1234
  int32_t code = -1;
59✔
1235

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

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

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

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

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

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

1273
  code = 0;
59✔
1274

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

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

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

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

1293
  SMnode *pMnode = pRsp->info.node;
236✔
1294
  SSdb   *pSdb = pMnode->pSdb;
236✔
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);
236✔
1299

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

1302
  return code;
236✔
1303
}
1304

1305
int32_t mndAddStbToTrans(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
1,959,567✔
1306
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
1,959,567✔
1307
  TAOS_CHECK_RETURN(mndTransCheckConflict(pMnode, pTrans));
1,959,567✔
1308
  TAOS_CHECK_RETURN(mndSetCreateStbCommitLogs(pMnode, pTrans, pDb, pStb));
1,954,374✔
1309
  TAOS_CHECK_RETURN(mndSetCreateStbRedoActions(pMnode, pTrans, pDb, pStb));
1,954,374✔
1310
  TAOS_CHECK_RETURN(mndSetCreateStbUndoActions(pMnode, pTrans, pDb, pStb));
1,954,374✔
1311
  return 0;
1,954,374✔
1312
}
1313

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

1324
  mDebug("start to process ttl timer");
3,313,150✔
1325

1326
  while (1) {
12,979,145✔
1327
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
16,292,295✔
1328
    if (pIter == NULL) break;
16,292,295✔
1329

1330
    if (pVgroup->mountVgId) {
12,979,145✔
1331
      sdbRelease(pSdb, pVgroup);
1,068✔
1332
      continue;
1,068✔
1333
    }
1334

1335
    int32_t   code = 0;
12,978,077✔
1336
    SMsgHead *pHead = rpcMallocCont(contLen);
12,978,077✔
1337
    if (pHead == NULL) {
12,978,077✔
1338
      sdbRelease(pSdb, pVgroup);
×
1339
      continue;
×
1340
    }
1341
    pHead->contLen = htonl(contLen);
12,978,077✔
1342
    pHead->vgId = htonl(pVgroup->vgId);
12,978,077✔
1343
    if ((code = tSerializeSVDropTtlTableReq((char *)pHead + sizeof(SMsgHead), reqLen, &ttlReq)) < 0) {
12,978,077✔
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 = {
12,978,077✔
1350
        .msgType = TDMT_VND_FETCH_TTL_EXPIRED_TBS, .pCont = pHead, .contLen = contLen, .info = pReq->info};
1351
    SEpSet epSet = mndGetVgroupEpset(pMnode, pVgroup);
12,978,077✔
1352
    code = tmsgSendReq(&epSet, &rpcMsg);
12,978,077✔
1353
    if (code != 0) {
12,978,077✔
1354
      mError("vgId:%d, failed to send drop ttl table request to vnode since 0x%x", pVgroup->vgId, code);
39,283✔
1355
    } else {
1356
      mDebug("vgId:%d, send drop ttl table request to vnode, time:%" PRId32, pVgroup->vgId, ttlReq.timestampSec);
12,938,794✔
1357
    }
1358
    sdbRelease(pSdb, pVgroup);
12,978,077✔
1359
  }
1360

1361
  return 0;
3,313,150✔
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,627,772✔
1420
  for (int32_t tag = 0; tag < pStb->numOfTags; tag++) {
28,600,424✔
1421
    if (strcmp(pStb->pTags[tag].name, tagName) == 0) {
25,880,612✔
1422
      return tag;
907,960✔
1423
    }
1424
  }
1425

1426
  return -1;
2,719,812✔
1427
}
1428

1429
static int32_t mndFindSuperTableColumnIndex(const SStbObj *pStb, const char *colName) {
5,569,040✔
1430
  for (int32_t col = 0; col < pStb->numOfColumns; col++) {
312,958,623✔
1431
    if (strcmp(pStb->pColumns[col].name, colName) == 0) {
310,164,441✔
1432
      return col;
2,774,858✔
1433
    }
1434
  }
1435

1436
  return -1;
2,794,182✔
1437
}
1438

1439
static bool mndValidateSchema(SSchema *pSchemas, int32_t nSchema, SArray *pFields, int32_t maxLen) {
2,959,153✔
1440
  int32_t rowLen = 0;
2,959,153✔
1441
  for (int32_t i = 0; i < nSchema; ++i) {
201,656,998✔
1442
    rowLen += (pSchemas + i)->bytes;
198,697,845✔
1443
  }
1444

1445
  int32_t nField = taosArrayGetSize(pFields);
2,959,153✔
1446
  for (int32_t i = 0; i < nField; ++i) {
5,918,306✔
1447
    rowLen += ((SField *)TARRAY_GET_ELEM(pFields, i))->bytes;
2,959,153✔
1448
  }
1449

1450
  return rowLen <= maxLen;
2,959,153✔
1451
}
1452

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

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

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

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

1478
  for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
221,783✔
1479
    SFieldWithOptions *pField = taosArrayGet(createReq->pColumns, i);
191,176✔
1480
    SSchema           *pSchema = &pDst->pColumns[i];
191,176✔
1481
    pSchema->type = pField->type;
191,176✔
1482
    pSchema->bytes = pField->bytes;
191,176✔
1483
    pSchema->flags = pField->flags;
191,176✔
1484
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
191,176✔
1485
    int32_t cIndex = mndFindSuperTableColumnIndex(pStb, pField->name);
191,176✔
1486
    if (cIndex >= 0) {
191,176✔
1487
      pSchema->colId = pStb->pColumns[cIndex].colId;
177,386✔
1488
    } else {
1489
      pSchema->colId = pDst->nextColId++;
13,790✔
1490
    }
1491
  }
1492

1493
  for (int32_t i = 0; i < pDst->numOfTags; ++i) {
226,244✔
1494
    SField  *pField = taosArrayGet(createReq->pTags, i);
195,637✔
1495
    SSchema *pSchema = &pDst->pTags[i];
195,637✔
1496
    pSchema->type = pField->type;
195,637✔
1497
    pSchema->bytes = pField->bytes;
195,637✔
1498
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
195,637✔
1499
    int32_t cIndex = mndFindSuperTableTagIndex(pStb, pField->name);
195,637✔
1500
    if (cIndex >= 0) {
195,637✔
1501
      pSchema->colId = pStb->pTags[cIndex].colId;
185,759✔
1502
    } else {
1503
      pSchema->colId = pDst->nextColId++;
9,878✔
1504
    }
1505
  }
1506
  for (int32_t i = 0; i < pDst->numOfColumns; i++) {
221,783✔
1507
    SColCmpr          *p = pDst->pCmpr + i;
191,176✔
1508
    SFieldWithOptions *pField = taosArrayGet(createReq->pColumns, i);
191,176✔
1509
    SSchema           *pSchema = &pDst->pColumns[i];
191,176✔
1510
    p->id = pSchema->colId;
191,176✔
1511
    if (pField->compress == 0) {
191,176✔
1512
      p->alg = createDefaultColCmprByType(pSchema->type);
×
1513
    } else {
1514
      p->alg = pField->compress;
191,176✔
1515
    }
1516
    if (pField->flags & COL_HAS_TYPE_MOD) {
191,176✔
1517
      pDst->pExtSchemas[i].typeMod = pField->typeMod;
×
1518
    }
1519
  }
1520
  pDst->tagVer = createReq->tagVer;
30,607✔
1521
  pDst->colVer = createReq->colVer;
30,607✔
1522
  return TSDB_CODE_SUCCESS;
30,607✔
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){
30,607✔
1527
  SMAlterStbReq alterReq = {0};
30,607✔
1528
  alterReq.pFields = taosArrayInit(2, sizeof(SField));
30,607✔
1529
  if (NULL == alterReq.pFields) {
30,607✔
1530
    mError("failed to init alter fields array");
×
1531
    goto END;
×
1532
  }
1533
  tstrncpy(alterReq.name, pStb->name, TSDB_TABLE_FNAME_LEN);
30,607✔
1534
  for (int32_t i = 0; i < pDst->numOfColumns && taosArrayGetSize(alterReq.pFields) == 0; ++i) {
213,989✔
1535
    SSchema           *pSchema = &pDst->pColumns[i];
183,382✔
1536
    int32_t cIndex = mndFindSuperTableColumnIndex(pStb, pSchema->name);
183,382✔
1537
    if (cIndex >= 0 && pSchema->bytes == pStb->pColumns[cIndex].bytes) {
183,382✔
1538
      continue;
167,156✔
1539
    }
1540
    if (cIndex < 0) {
16,226✔
1541
      alterReq.alterType = TSDB_ALTER_TABLE_ADD_COLUMN;
13,790✔
1542
    } else if (pSchema->bytes > pStb->pColumns[cIndex].bytes){
2,436✔
1543
      alterReq.alterType = TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES;
2,436✔
1544
    }
1545
    SField *pAlterField = taosArrayReserve(alterReq.pFields, 1);
16,226✔
1546
    pAlterField->type = pSchema->type;
16,226✔
1547
    pAlterField->bytes = pSchema->bytes;
16,226✔
1548
    tstrncpy(pAlterField->name, pSchema->name, TSDB_COL_NAME_LEN);
16,226✔
1549
    mDebug("alter column name:%s, type:%d, bytes:%d", pAlterField->name, pAlterField->type, pAlterField->bytes);
16,226✔
1550
  }
1551

1552
  for (int32_t i = 0; i < pDst->numOfTags && taosArrayGetSize(alterReq.pFields) == 0; ++i) {
143,933✔
1553
    SSchema *pSchema = &pDst->pTags[i];
113,326✔
1554
    int32_t cIndex = mndFindSuperTableTagIndex(pStb, pSchema->name);
113,326✔
1555
    if (cIndex >= 0 && pSchema->bytes == pStb->pTags[cIndex].bytes) {
113,326✔
1556
      continue;
98,945✔
1557
    }
1558
    if (cIndex < 0) {
14,381✔
1559
      alterReq.alterType = TSDB_ALTER_TABLE_ADD_TAG;
9,878✔
1560
    } else if (pSchema->bytes > pStb->pTags[cIndex].bytes){
4,503✔
1561
      alterReq.alterType = TSDB_ALTER_TABLE_UPDATE_TAG_BYTES;
4,503✔
1562
    }
1563
    SField *pAlterField = taosArrayReserve(alterReq.pFields, 1);
14,381✔
1564
    pAlterField->type = pSchema->type;
14,381✔
1565
    pAlterField->bytes = pSchema->bytes;
14,381✔
1566
    tstrncpy(pAlterField->name, pSchema->name, TSDB_COL_NAME_LEN);
14,381✔
1567
    mDebug("alter tag name:%s, type:%d, bytes:%d", pAlterField->name, pAlterField->type, pAlterField->bytes);
14,381✔
1568
  }
1569
  alterReq.numOfFields = taosArrayGetSize(alterReq.pFields);
30,607✔
1570
  if (alterReq.numOfFields == 0) {
30,607✔
1571
    mError("no valid alter field found");
×
1572
    goto END;
×
1573
  }
1574

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

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

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

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

1619
  pStb = mndAcquireStb(pMnode, createReq.name);
1,927,461✔
1620
  if (pStb != NULL) {
1,927,461✔
1621
    if (createReq.igExists) {
35,920✔
1622
      if (createReq.source == TD_REQ_FROM_APP) {
34,487✔
1623
        mInfo("stb:%s, already exist, ignore exist is set", createReq.name);
2,944✔
1624
        code = 0;
2,944✔
1625
        goto _OVER;
2,944✔
1626
      } else if (pStb->uid != createReq.suid) {
31,543✔
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) {
62,150✔
1631
        int32_t tagDelta = createReq.tagVer - pStb->tagVer;
31,543✔
1632
        int32_t colDelta = createReq.colVer - pStb->colVer;
31,543✔
1633
        mInfo("stb:%s, already exist while create, input tagVer:%d colVer:%d, exist tagVer:%d colVer:%d",
31,543✔
1634
              createReq.name, createReq.tagVer, createReq.colVer, pStb->tagVer, pStb->colVer);
1635
        if (tagDelta <= 0 && colDelta <= 0) {
31,543✔
1636
          mInfo("stb:%s, schema version is not incremented and nothing needs to be done", createReq.name);
936✔
1637
          code = 0;
936✔
1638
          goto _OVER;
936✔
1639
        } else if ((tagDelta == 1 && colDelta == 0) || (tagDelta == 0 && colDelta == 1) ||
30,607✔
1640
                   (pStb->colVer == 1 && createReq.colVer > 1) || (pStb->tagVer == 1 && createReq.tagVer > 1)) {
×
1641
          isAlter = true;
30,607✔
1642
          mInfo("stb:%s, schema version is only increased by 1 number, do alter operation", createReq.name);
30,607✔
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,433✔
1656
      goto _OVER;
1,433✔
1657
    }
1658
  } else if (terrno != TSDB_CODE_MND_STB_NOT_EXIST) {
1,891,541✔
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,891,541✔
1661
             (createReq.tagVer != 1 || createReq.colVer != 1)) {
4,706✔
1662
    mInfo("stb:%s, alter table does not need to be done, because table is deleted", createReq.name);
×
1663
    code = 0;
×
1664
    goto _OVER;
×
1665
  }
1666

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

1674
  for (int32_t i = 0; i < createReq.numOfColumns; ++i) {
158,996,111✔
1675
    SFieldWithOptions *pField = taosArrayGet(createReq.pColumns, i);
157,073,963✔
1676
    if ((code = taosHashPut(pHash, pField->name, strlen(pField->name), NULL, 0)) != 0) {
157,073,963✔
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,118,449✔
1685
    SField *pField = taosArrayGet(createReq.pTags, i);
8,196,496✔
1686
    if ((code = taosHashPut(pHash, pField->name, strlen(pField->name), NULL, 0)) != 0) {
8,196,496✔
1687
      if (code == TSDB_CODE_DUP_KEY) {
195✔
1688
        code = TSDB_CODE_TSC_DUP_COL_NAMES;
195✔
1689
      }
1690
      goto _OVER;
195✔
1691
    }
1692
  }
1693

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

1700
  if ((code = mndAcquireUser(pMnode, (RPC_MSG_USER(pReq)), &pOperUser))) {
1,921,953✔
1701
    goto _OVER;
×
1702
  }
1703

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

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

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

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

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

1729
  if ((code = grantCheck(TSDB_GRANT_STABLE)) < 0) {
1,921,953✔
1730
    goto _OVER;
×
1731
  }
1732

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

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

1761
    int64_t tse = taosGetTimestampMs();
1,921,953✔
1762
    double  duration = (double)(tse - tss);
1,921,953✔
1763
    duration = duration / 1000;
1,921,953✔
1764
    if (createReq.sql == NULL && createReq.sqlLen == 0) {
1,923,708✔
1765
      char detail[1000] = {0};
382,710✔
1766

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

1769
      auditRecord(pReq, pMnode->clusterId, "createStb", name.dbname, name.tname, detail, strlen(detail), duration, 0);
382,710✔
1770
    } else {
1771
      auditRecord(pReq, pMnode->clusterId, "createStb", name.dbname, name.tname, createReq.sql, createReq.sqlLen,
1,539,243✔
1772
                  duration, 0);
1773
    }
1774
  }
1775
_OVER:
1,923,689✔
1776
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
1,927,461✔
1777
    mError("stb:%s, failed to create since %s", createReq.name, tstrerror(code));
7,961✔
1778
  }
1779

1780
  mndReleaseStb(pMnode, pStb);
1,927,461✔
1781
  mndReleaseDb(pMnode, pDb);
1,927,461✔
1782
  mndReleaseUser(pMnode, pOperUser);
1,927,461✔
1783
  tFreeSMCreateStbReq(&createReq);
1,927,461✔
1784

1785
  if (pHash != NULL) {
1,927,461✔
1786
    taosHashCleanup(pHash);
1,922,148✔
1787
  }
1788

1789
  TAOS_RETURN(code);
1,927,461✔
1790
}
1791

1792
static int32_t mndCheckAlterStbReq(SMAlterStbReq *pAlter) {
5,697,109✔
1793
  int32_t code = 0;
5,697,109✔
1794
  if (pAlter->commentLen >= 0) return 0;
5,697,109✔
1795
  if (pAlter->ttl != 0) return 0;
14,037✔
1796
  if (pAlter->keep != -1) return 0;
14,037✔
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,438,083✔
1816
  pNew->pTags = taosMemoryCalloc(pNew->numOfTags, sizeof(SSchema));
5,438,083✔
1817
  pNew->pColumns = taosMemoryCalloc(pNew->numOfColumns, sizeof(SSchema));
5,438,083✔
1818
  pNew->pCmpr = taosMemoryCalloc(pNew->numOfColumns, sizeof(SColCmpr));
5,438,083✔
1819
  if (pNew->pTags == NULL || pNew->pColumns == NULL || pNew->pCmpr == NULL) {
5,438,083✔
1820
    TAOS_RETURN(terrno);
×
1821
  }
1822

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

1834
  TAOS_RETURN(0);
5,438,083✔
1835
}
1836

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

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

1857
  if (keep > 0) {
24,934✔
1858
    pNew->keep = keep;
13,452✔
1859
  }
1860

1861
  if (secureDelete >= 0) {
24,934✔
1862
    pNew->secureDelete = secureDelete;
585✔
1863
  }
1864

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

1871
static int32_t mndAddSuperTableTag(const SStbObj *pOld, SStbObj *pNew, SArray *pFields, int32_t ntags) {
295,217✔
1872
  int32_t code = 0;
295,217✔
1873
  if (pOld->numOfTags + ntags > TSDB_MAX_TAGS) {
295,217✔
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;
295,217✔
1879
  if (pOld->numOfColumns + ntags + pOld->numOfTags > maxColumns) {
295,217✔
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)) {
295,217✔
1885
    code = TSDB_CODE_PAR_INVALID_TAGS_LENGTH;
19,430✔
1886
    TAOS_RETURN(code);
19,430✔
1887
  }
1888

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

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

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

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

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

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

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

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

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

1941
    if (isTag) {
236✔
1942
      code = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TSMA;
236✔
1943
      mError("tsma:%s, check tag:%d conflicted", pSma->name, colId);
236✔
1944
      sdbRelease(pSdb, pSma);
236✔
1945
      sdbCancelFetch(pSdb, pIter);
236✔
1946
      TAOS_RETURN(code);
236✔
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,561,111✔
1991
}
1992

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

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

2004
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
109,002✔
2005

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

2009
  pNew->tagVer++;
109,002✔
2010

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

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

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

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

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

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

2040
  if (mndFindSuperTableTagIndex(pOld, newTagName) >= 0) {
114,443✔
2041
    code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
6,435✔
2042
    TAOS_RETURN(code);
6,435✔
2043
  }
2044

2045
  if (mndFindSuperTableColumnIndex(pOld, newTagName) >= 0) {
108,008✔
2046
    code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
195✔
2047
    TAOS_RETURN(code);
195✔
2048
  }
2049

2050
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
107,813✔
2051

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

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

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

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

2071
  uint32_t nLen = 0;
320,365✔
2072
  for (int32_t i = 0; i < pOld->numOfTags; ++i) {
12,787,241✔
2073
    nLen += (pOld->pTags[i].colId == colId) ? pField->bytes : pOld->pTags[i].bytes;
12,466,876✔
2074
  }
2075

2076
  if (nLen > TSDB_MAX_TAGS_LEN) {
320,365✔
2077
    code = TSDB_CODE_PAR_INVALID_TAGS_LENGTH;
191,620✔
2078
    TAOS_RETURN(code);
191,620✔
2079
  }
2080

2081
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
128,745✔
2082

2083
  SSchema *pTag = pNew->pTags + tag;
128,745✔
2084

2085
  if (!(pTag->type == TSDB_DATA_TYPE_BINARY || pTag->type == TSDB_DATA_TYPE_VARBINARY ||
128,745✔
2086
        pTag->type == TSDB_DATA_TYPE_NCHAR || pTag->type == TSDB_DATA_TYPE_GEOMETRY)) {
122,935✔
2087
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
195✔
2088
    TAOS_RETURN(code);
195✔
2089
  }
2090

2091
  if (pField->bytes <= pTag->bytes) {
128,550✔
2092
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
35,035✔
2093
    TAOS_RETURN(code);
35,035✔
2094
  }
2095

2096
  pTag->bytes = pField->bytes;
93,515✔
2097
  pNew->tagVer++;
93,515✔
2098

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

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

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

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

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

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

2137
  if (updated == 0) {
91,343✔
2138
    code = TSDB_CODE_MND_COLUMN_COMPRESS_ALREADY_EXIST;
7,910✔
2139
    TAOS_RETURN(code);
7,910✔
2140
  } else if (updated == -1) {
83,433✔
2141
    code = TSDB_CODE_TSC_COMPRESS_LEVEL_ERROR;
×
2142
    TAOS_RETURN(code);
×
2143
  }
2144

2145
  pNew->colVer++;
83,433✔
2146

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

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

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

2168
  pNew->numOfColumns = pNew->numOfColumns + ncols;
2,663,936✔
2169

2170
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
2,663,936✔
2171

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

2177
  for (int32_t i = 0; i < ncols; i++) {
5,044,319✔
2178
    if (withCompress) {
2,662,796✔
2179
      SFieldWithOptions *pField = taosArrayGet(pReq->pFields, i);
256,526✔
2180
      if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
256,526✔
2181
        code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
×
2182
        TAOS_RETURN(code);
×
2183
      }
2184

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

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

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

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

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

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

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

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

2266
  if (col == 0) {
1,553,338✔
2267
    code = TSDB_CODE_MND_INVALID_STB_ALTER_OPTION;
1,638✔
2268
    TAOS_RETURN(code);
1,638✔
2269
  }
2270

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

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

2279
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
1,551,505✔
2280

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

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

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

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

2304
  uint32_t nLen = 0;
499,491✔
2305
  int32_t  maxBytesPerRow = pOld->virtualStb ? TSDB_MAX_BYTES_PER_ROW_VIRTUAL : TSDB_MAX_BYTES_PER_ROW;
499,491✔
2306
  for (int32_t i = 0; i < pOld->numOfColumns; ++i) {
39,119,065✔
2307
    nLen += (pOld->pColumns[i].colId == colId) ? pField->bytes : pOld->pColumns[i].bytes;
38,619,574✔
2308
  }
2309

2310
  if (nLen > maxBytesPerRow) {
499,491✔
2311
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
33,695✔
2312
    TAOS_RETURN(code);
33,695✔
2313
  }
2314

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

2317
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
465,796✔
2318

2319
  SSchema *pCol = pNew->pColumns + col;
465,796✔
2320
  if (!(pCol->type == TSDB_DATA_TYPE_BINARY || pCol->type == TSDB_DATA_TYPE_VARBINARY ||
465,796✔
2321
        pCol->type == TSDB_DATA_TYPE_NCHAR || pCol->type == TSDB_DATA_TYPE_GEOMETRY)) {
456,493✔
2322
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
195✔
2323
    TAOS_RETURN(code);
195✔
2324
  }
2325

2326
  if (pField->bytes <= pCol->bytes) {
465,601✔
2327
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
186,455✔
2328
    TAOS_RETURN(code);
186,455✔
2329
  }
2330

2331
  pCol->bytes = pField->bytes;
279,146✔
2332
  pNew->colVer++;
279,146✔
2333

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

2338
static int32_t mndSetAlterStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
4,697,003✔
2339
  int32_t  code = 0;
4,697,003✔
2340
  SSdbRaw *pRedoRaw = mndStbActionEncode(pStb);
4,697,003✔
2341
  if (pRedoRaw == NULL) {
4,697,003✔
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,697,003✔
2347
    sdbFreeRaw(pRedoRaw);
×
2348
    TAOS_RETURN(code);
×
2349
  }
2350
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY));
4,697,003✔
2351

2352
  TAOS_RETURN(code);
4,697,003✔
2353
}
2354

2355
static int32_t mndSetAlterStbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
4,697,003✔
2356
  int32_t  code = 0;
4,697,003✔
2357
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
4,697,003✔
2358
  if (pCommitRaw == NULL) {
4,697,003✔
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,697,003✔
2364
    sdbFreeRaw(pCommitRaw);
×
2365
    TAOS_RETURN(code);
×
2366
  }
2367
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
4,697,003✔
2368

2369
  TAOS_RETURN(code);
4,697,003✔
2370
}
2371

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

2380
  while (1) {
12,046,854✔
2381
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
16,743,857✔
2382
    if (pIter == NULL) break;
16,743,857✔
2383
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
12,046,854✔
2384
      sdbRelease(pSdb, pVgroup);
5,577,413✔
2385
      continue;
5,577,413✔
2386
    }
2387

2388
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, alterOriData, alterOriDataLen);
6,469,441✔
2389
    if (pReq == NULL) {
6,469,441✔
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,469,441✔
2397
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
6,469,441✔
2398
    action.pCont = pReq;
6,469,441✔
2399
    action.contLen = contLen;
6,469,441✔
2400
    action.msgType = TDMT_VND_ALTER_STB;
6,469,441✔
2401
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
6,469,441✔
2402
      taosMemoryFree(pReq);
×
2403
      sdbCancelFetch(pSdb, pIter);
×
2404
      sdbRelease(pSdb, pVgroup);
×
2405
      TAOS_RETURN(code);
×
2406
    }
2407
    sdbRelease(pSdb, pVgroup);
6,469,441✔
2408
  }
2409

2410
  TAOS_RETURN(code);
4,697,003✔
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) {
22,268,296✔
2455
  int32_t code = 0;
22,268,296✔
2456
  taosRLockLatch(&pStb->lock);
22,268,296✔
2457

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

2490
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
617,312,565✔
2491
    SSchema *pSchema = &pRsp->pSchemas[i];
595,044,269✔
2492
    SSchema *pSrcSchema = &pStb->pColumns[i];
595,044,269✔
2493
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
595,044,269✔
2494
    pSchema->type = pSrcSchema->type;
595,044,269✔
2495
    pSchema->flags = pSrcSchema->flags;
595,044,269✔
2496
    pSchema->colId = pSrcSchema->colId;
595,044,269✔
2497
    pSchema->bytes = pSrcSchema->bytes;
595,044,654✔
2498
  }
2499
  
2500
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
102,732,540✔
2501
    SSchema *pSchema = &pRsp->pSchemas[i + pStb->numOfColumns];
80,464,244✔
2502
    SSchema *pSrcSchema = &pStb->pTags[i];
80,464,244✔
2503
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
80,464,244✔
2504
    pSchema->type = pSrcSchema->type;
80,464,244✔
2505
    pSchema->flags = pSrcSchema->flags;
80,464,244✔
2506
    pSchema->colId = pSrcSchema->colId;
80,464,244✔
2507
    pSchema->bytes = pSrcSchema->bytes;
80,464,244✔
2508
  }
2509

2510
  if (refByStm) {
22,268,296✔
2511
    mndStreamUpdateTagsRefFlag(pMnode, pStb->uid, &pRsp->pSchemas[pStb->numOfColumns], pStb->numOfTags);
15,665,964✔
2512
  }
2513

2514
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
617,311,410✔
2515
    SColCmpr   *pCmpr = &pStb->pCmpr[i];
595,043,114✔
2516
    SSchemaExt *pSchEx = &pRsp->pSchemaExt[i];
595,042,729✔
2517
    pSchEx->colId = pCmpr->id;
595,043,114✔
2518
    pSchEx->compress = pCmpr->alg;
595,043,884✔
2519
    if (pStb->pExtSchemas) {
595,043,114✔
2520
      pSchEx->typeMod = pStb->pExtSchemas[i].typeMod;
292,553,048✔
2521
    }
2522
  }
2523

2524
  taosRUnLockLatch(&pStb->lock);
22,268,296✔
2525
  TAOS_RETURN(code);
22,268,296✔
2526
}
2527

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

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

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

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

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

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

2581
  pRsp->pSchemaExt = taosMemoryCalloc(pStb->numOfColumns, sizeof(SSchemaExt));
26,239✔
2582
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
143,309✔
2583
    SColCmpr *pCmpr = &pStb->pCmpr[i];
117,070✔
2584

2585
    SSchemaExt *pSchExt = &pRsp->pSchemaExt[i];
117,070✔
2586
    pSchExt->colId = pCmpr->id;
117,070✔
2587
    pSchExt->compress = pCmpr->alg;
117,070✔
2588
    if (pStb->pExtSchemas) {
117,070✔
2589
      pSchExt->typeMod = pStb->pExtSchemas[i].typeMod;
25,142✔
2590
    }
2591
  }
2592
  pRsp->virtualStb = pStb->virtualStb;
26,239✔
2593
  pRsp->pColRefs = NULL;
26,239✔
2594
  pRsp->secureDelete = pStb->secureDelete;
26,239✔
2595

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

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

2605
  SDbObj *pDb = mndAcquireDb(pMnode, pStbVer->dbFName);
8,441,655✔
2606
  if (pDb == NULL) {
8,441,655✔
2607
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
34,548✔
2608
    TAOS_RETURN(code);
34,548✔
2609
  }
2610

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

2617
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
8,406,676✔
2618
  if (pStb == NULL) {
8,406,676✔
2619
    mndReleaseDb(pMnode, pDb);
4,113✔
2620
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
4,113✔
2621
    TAOS_RETURN(code);
4,113✔
2622
  }
2623

2624
  taosRLockLatch(&pStb->lock);
8,402,563✔
2625

2626
  if (pStbVer->sversion != pStb->colVer || pStbVer->tversion != pStb->tagVer) {
8,402,563✔
2627
    *schema = true;
37,660✔
2628
  } else {
2629
    *schema = false;
8,364,903✔
2630
  }
2631

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

2638
  taosRUnLockLatch(&pStb->lock);
8,402,563✔
2639

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

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

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

2656
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
16,446,176✔
2657
  if (pStb == NULL) {
16,446,176✔
2658
    mndReleaseDb(pMnode, pDb);
742,552✔
2659
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
742,552✔
2660
    TAOS_RETURN(code);
742,552✔
2661
  }
2662

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

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

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

2680
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
26,239✔
2681
  if (pStb == NULL) {
26,239✔
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);
26,239✔
2688

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

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

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

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

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

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

2730
  tFreeSMAlterStbRsp(&alterRsp);
4,641,462✔
2731

2732
  if (code < 0) TAOS_RETURN(code);
4,641,462✔
2733

2734
  *pCont = cont;
4,641,462✔
2735
  *pLen = contLen;
4,641,462✔
2736

2737
  TAOS_RETURN(code);
4,641,462✔
2738
}
2739

2740
int32_t mndBuildSMCreateStbRsp(SMnode *pMnode, char *dbFName, char *stbFName, void **pCont, int32_t *pLen) {
1,924,754✔
2741
  int32_t code = -1;
1,924,754✔
2742
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
1,924,754✔
2743
  if (NULL == pDb) {
1,924,754✔
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);
1,924,754✔
2750
  if (NULL == pObj) {
1,924,754✔
2751
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
1,544✔
2752
    if (terrno != 0) code = terrno;
1,544✔
2753
    goto _OVER;
1,544✔
2754
  }
2755

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

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

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

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

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

2790
  tFreeSMCreateStbRsp(&stbRsp);
1,923,210✔
2791

2792
  *pCont = cont;
1,923,210✔
2793
  *pLen = contLen;
1,923,210✔
2794

2795
  code = 0;
1,923,210✔
2796

2797
_OVER:
1,924,754✔
2798
  if (pObj) {
1,924,754✔
2799
    mndReleaseStb(pMnode, pObj);
1,923,210✔
2800
  }
2801

2802
  if (pDb) {
1,924,754✔
2803
    mndReleaseDb(pMnode, pDb);
1,924,754✔
2804
  }
2805

2806
  TAOS_RETURN(code);
1,924,754✔
2807
}
2808

2809
static int32_t mndAlterStbImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
4,651,038✔
2810
                              void *alterOriData, int32_t alterOriDataLen) {
2811
  int32_t code = -1;
4,651,038✔
2812
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "alter-stb");
4,651,038✔
2813
  if (pTrans == NULL) {
4,651,038✔
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,651,038✔
2820
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
4,651,038✔
2821
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
4,651,038✔
2822

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

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

2835
  code = 0;
4,480,188✔
2836

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

2842
static int32_t mndAlterStbAndUpdateTagIdxImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
216,815✔
2843
                                             void *alterOriData, int32_t alterOriDataLen, const SMAlterStbReq *pAlter) {
2844
  int32_t code = -1;
216,815✔
2845
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "alter-stb");
216,815✔
2846
  if (pTrans == NULL) {
216,815✔
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);
216,815✔
2853
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
216,815✔
2854

2855
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
216,815✔
2856

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

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

2874
    if (exist == true) {
109,002✔
2875
      TAOS_CHECK_GOTO(mndSetDropIdxPrepareLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
4,291✔
2876
      TAOS_CHECK_GOTO(mndSetDropIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
4,291✔
2877
    }
2878

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

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

2890
    if (mndGetIdxsByTagName(pMnode, pStb, pField0->name, &idxObj) == 0) {
107,813✔
2891
      exist = true;
13,944✔
2892
    }
2893

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

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

2904
    TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
107,813✔
2905
    TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
107,813✔
2906
  }
2907
  code = 0;
216,815✔
2908

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

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

2919
  SStbObj stbObj = {0};
5,681,314✔
2920
  taosRLockLatch(&pOld->lock);
5,681,314✔
2921
  memcpy(&stbObj, pOld, sizeof(SStbObj));
5,681,314✔
2922
  taosRUnLockLatch(&pOld->lock);
5,681,314✔
2923
  stbObj.pColumns = NULL;
5,681,314✔
2924
  stbObj.pTags = NULL;
5,681,314✔
2925
  stbObj.pFuncs = NULL;
5,681,314✔
2926
  stbObj.pCmpr = NULL;
5,681,314✔
2927
  stbObj.pExtSchemas = NULL;
5,681,314✔
2928
  stbObj.updateTime = taosGetTimestampMs();
5,681,314✔
2929
  stbObj.lock = 0;
5,681,314✔
2930
  stbObj.virtualStb = pOld->virtualStb;
5,681,314✔
2931
  bool updateTagIndex = false;
5,681,314✔
2932
  switch (pAlter->alterType) {
5,681,314✔
2933
    case TSDB_ALTER_TABLE_ADD_TAG:
295,217✔
2934
      code = mndAddSuperTableTag(pOld, &stbObj, pAlter->pFields, pAlter->numOfFields);
295,217✔
2935
      break;
295,217✔
2936
    case TSDB_ALTER_TABLE_DROP_TAG:
109,315✔
2937
      pField0 = taosArrayGet(pAlter->pFields, 0);
109,315✔
2938
      code = mndDropSuperTableTag(pMnode, pOld, &stbObj, pField0->name);
109,315✔
2939
      updateTagIndex = true;
109,315✔
2940
      break;
109,315✔
2941
    case TSDB_ALTER_TABLE_UPDATE_TAG_NAME:
118,321✔
2942
      code = mndAlterStbTagName(pMnode, pOld, &stbObj, pAlter->pFields);
118,321✔
2943
      updateTagIndex = true;
118,321✔
2944
      break;
118,321✔
2945
    case TSDB_ALTER_TABLE_UPDATE_TAG_BYTES:
320,560✔
2946
      pField0 = taosArrayGet(pAlter->pFields, 0);
320,560✔
2947
      code = mndAlterStbTagBytes(pMnode, pOld, &stbObj, pField0);
320,560✔
2948
      break;
320,560✔
2949
    case TSDB_ALTER_TABLE_ADD_COLUMN:
2,407,410✔
2950
      code = mndAddSuperTableColumn(pOld, &stbObj, pAlter, pAlter->numOfFields, 0);
2,407,410✔
2951
      break;
2,407,410✔
2952
    case TSDB_ALTER_TABLE_DROP_COLUMN:
1,555,567✔
2953
      pField0 = taosArrayGet(pAlter->pFields, 0);
1,555,567✔
2954
      code = mndDropSuperTableColumn(pMnode, pOld, &stbObj, pField0->name);
1,555,567✔
2955
      break;
1,555,567✔
2956
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES:
499,881✔
2957
      pField0 = taosArrayGet(pAlter->pFields, 0);
499,881✔
2958
      code = mndAlterStbColumnBytes(pMnode, pOld, &stbObj, pField0);
499,881✔
2959
      break;
499,881✔
2960
    case TSDB_ALTER_TABLE_UPDATE_OPTIONS:
24,934✔
2961
      needRsp = false;
24,934✔
2962
      code = mndUpdateTableOptions(pOld, &stbObj, pAlter->comment, pAlter->commentLen, pAlter->ttl, pAlter->keep,
24,934✔
2963
                                   pAlter->secureDelete);
24,934✔
2964
      break;
24,934✔
2965
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_COMPRESS:
93,583✔
2966
      code = mndUpdateSuperTableColumnCompress(pMnode, pOld, &stbObj, pAlter->pFields, pAlter->numOfFields);
93,583✔
2967
      break;
93,583✔
2968
    case TSDB_ALTER_TABLE_ADD_COLUMN_WITH_COMPRESS_OPTION:
256,526✔
2969
      code = mndAddSuperTableColumn(pOld, &stbObj, pAlter, pAlter->numOfFields, 1);
256,526✔
2970
      break;
256,526✔
2971
    default:
×
2972
      needRsp = false;
×
2973
      terrno = TSDB_CODE_OPS_NOT_SUPPORT;
×
2974
      break;
×
2975
  }
2976

2977
  if (code != 0) goto _OVER;
5,681,314✔
2978
  if (updateTagIndex == false) {
4,837,246✔
2979
    code = mndAlterStbImp(pMnode, pReq, pDb, &stbObj, needRsp, pReq->pCont, pReq->contLen);
4,620,431✔
2980
  } else {
2981
    code = mndAlterStbAndUpdateTagIdxImp(pMnode, pReq, pDb, &stbObj, needRsp, pReq->pCont, pReq->contLen, pAlter);
216,815✔
2982
  }
2983

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

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

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

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

3012
  pDb = mndAcquireDbByStb(pMnode, alterReq.name);
5,697,109✔
3013
  if (pDb == NULL) {
5,697,109✔
3014
    code = TSDB_CODE_MND_DB_NOT_EXIST;
390✔
3015
    goto _OVER;
390✔
3016
  }
3017
  if (pDb->cfg.isMount) {
5,696,719✔
3018
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
275✔
3019
    goto _OVER;
275✔
3020
  }
3021

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

3028
  SName   name = {0};
5,681,314✔
3029
  int32_t ret = 0;
5,681,314✔
3030
  if ((ret = tNameFromString(&name, alterReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0)
5,681,314✔
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,681,314✔
3037
  TAOS_CHECK_GOTO(mndCheckDbPrivilege(pMnode, RPC_MSG_USER(pReq), RPC_MSG_TOKEN(pReq), MND_OPER_USE_DB, pDb), NULL,
5,681,314✔
3038
                  _OVER);
3039
  TAOS_CHECK_GOTO(mndCheckDbPrivilegeByNameRecF(pMnode, pOperUser, PRIV_CM_ALTER, PRIV_OBJ_TBL, pDb->name, name.tname),
5,681,314✔
3040
                  NULL, _OVER);
3041

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

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

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

3062
  TAOS_RETURN(code);
5,697,109✔
3063
}
3064

3065
static int32_t mndSetDropStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SStbObj *pStb) {
466,953✔
3066
  int32_t  code = 0;
466,953✔
3067
  SSdbRaw *pRedoRaw = mndStbActionEncode(pStb);
466,953✔
3068
  if (pRedoRaw == NULL) {
466,953✔
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) {
466,953✔
3074
    sdbFreeRaw(pRedoRaw);
×
3075
    TAOS_RETURN(code);
×
3076
  }
3077
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_DROPPING));
466,953✔
3078

3079
  TAOS_RETURN(code);
466,953✔
3080
}
3081

3082
static int32_t mndSetDropStbCommitLogs(SMnode *pMnode, STrans *pTrans, SStbObj *pStb) {
466,953✔
3083
  int32_t  code = 0;
466,953✔
3084
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
466,953✔
3085
  if (pCommitRaw == NULL) {
466,953✔
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) {
466,953✔
3091
    sdbFreeRaw(pCommitRaw);
×
3092
    TAOS_RETURN(code);
×
3093
  }
3094
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED));
466,953✔
3095

3096
  TAOS_RETURN(code);
466,953✔
3097
}
3098

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

3105
  while (1) {
1,242,687✔
3106
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
1,709,640✔
3107
    if (pIter == NULL) break;
1,709,640✔
3108
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
1,242,687✔
3109
      sdbRelease(pSdb, pVgroup);
312,826✔
3110
      continue;
312,826✔
3111
    }
3112

3113
    int32_t contLen = 0;
929,861✔
3114
    void   *pReq = mndBuildVDropStbReq(pMnode, pVgroup, pStb, &contLen);
929,861✔
3115
    if (pReq == NULL) {
929,861✔
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};
929,861✔
3123
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
929,861✔
3124
    action.pCont = pReq;
929,861✔
3125
    action.contLen = contLen;
929,861✔
3126
    action.msgType = TDMT_VND_DROP_STB;
929,861✔
3127
    action.acceptableCode = TSDB_CODE_TDB_STB_NOT_EXIST;
929,861✔
3128
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
929,861✔
3129
      taosMemoryFree(pReq);
×
3130
      sdbCancelFetch(pSdb, pIter);
×
3131
      sdbRelease(pSdb, pVgroup);
×
3132
      TAOS_RETURN(code);
×
3133
    }
3134
    sdbRelease(pSdb, pVgroup);
929,861✔
3135
  }
3136

3137
  TAOS_RETURN(code);
466,953✔
3138
}
3139

3140
static int32_t mndDropStb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb) {
466,953✔
3141
  int32_t code = -1;
466,953✔
3142
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "drop-stb");
466,953✔
3143
  if (pTrans == NULL) {
466,953✔
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);
466,953✔
3150
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
466,953✔
3151
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
466,953✔
3152

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

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

3167
static int32_t mndCheckDropStbForTopic(SMnode *pMnode, const char *stbFullName, int64_t suid) {
467,228✔
3168
  int32_t code = 0;
467,228✔
3169
  SSdb   *pSdb = pMnode->pSdb;
467,228✔
3170
  void   *pIter = NULL;
467,228✔
3171
  while (1) {
1,668✔
3172
    SMqTopicObj *pTopic = NULL;
468,896✔
3173
    pIter = sdbFetch(pSdb, SDB_TOPIC, pIter, (void **)&pTopic);
468,896✔
3174
    if (pIter == NULL) break;
468,896✔
3175

3176
    if (pTopic->stbUid == suid) {
1,668✔
3177
      sdbRelease(pSdb, pTopic);
×
3178
      sdbCancelFetch(pSdb, pIter);
×
3179
      TAOS_RETURN(TSDB_CODE_MND_TOPIC_MUST_BE_DELETED);
×
3180
    }
3181
    sdbRelease(pSdb, pTopic);
1,668✔
3182
  }
3183
  TAOS_RETURN(code);
467,228✔
3184
}
3185

3186
static int32_t mndCheckDropStbForStream(SMnode *pMnode, const char *stbFullName, int64_t suid) {
×
3187
  int32_t code = 0;
×
3188
  SSdb   *pSdb = pMnode->pSdb;
×
3189
  void   *pIter = NULL;
×
3190
  while (1) {
×
3191
    SStreamObj *pStream = NULL;
×
3192
    pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
×
3193
    if (pIter == NULL) break;
×
3194

3195
    if (pStream->pCreate->outStbUid == suid) {
×
3196
      sdbCancelFetch(pSdb, pIter);
×
3197
      sdbRelease(pSdb, pStream);
×
3198
      TAOS_RETURN(-1);
×
3199
    }
3200

3201
    sdbRelease(pSdb, pStream);
×
3202
  }
3203
  TAOS_RETURN(code);
×
3204
}
3205

3206
static int32_t mndProcessDropTtltbRsp(SRpcMsg *pRsp) { return 0; }
×
3207
static int32_t mndProcessTrimDbRsp(SRpcMsg *pRsp) { return 0; }
×
3208
static int32_t mndProcessTrimDbWalRsp(SRpcMsg *pRsp) { return 0; }
2,184✔
3209
static int32_t mndProcessS3MigrateDbRsp(SRpcMsg *pRsp) { return 0; }
×
3210

3211
static int32_t mndProcessDropStbReq(SRpcMsg *pReq) {
897,818✔
3212
  SMnode      *pMnode = pReq->info.node;
897,818✔
3213
  int32_t      code = -1;
897,818✔
3214
  SDbObj      *pDb = NULL;
897,818✔
3215
  SStbObj     *pStb = NULL;
897,818✔
3216
  SUserObj    *pOperUser = NULL;
897,818✔
3217
  SMDropStbReq dropReq = {0};
897,818✔
3218
  int64_t      tss = taosGetTimestampMs();
897,818✔
3219

3220
  TAOS_CHECK_GOTO(tDeserializeSMDropStbReq(pReq->pCont, pReq->contLen, &dropReq), NULL, _OVER);
897,818✔
3221

3222
  mInfo("stb:%s, start to drop", dropReq.name);
897,818✔
3223

3224
  pStb = mndAcquireStb(pMnode, dropReq.name);
897,818✔
3225
  if (pStb == NULL) {
897,818✔
3226
    if (dropReq.igNotExists) {
430,590✔
3227
      mInfo("stb:%s, not exist, ignore not exist is set", dropReq.name);
429,481✔
3228
      code = 0;
429,481✔
3229
      goto _OVER;
429,481✔
3230
    } else {
3231
      code = TSDB_CODE_MND_STB_NOT_EXIST;
1,109✔
3232
      goto _OVER;
1,109✔
3233
    }
3234
  }
3235

3236
  if ((dropReq.source == TD_REQ_FROM_TAOX_OLD || dropReq.source == TD_REQ_FROM_TAOX) && pStb->uid != dropReq.suid) {
467,228✔
3237
    code = 0;
×
3238
    goto _OVER;
×
3239
  }
3240

3241
  pDb = mndAcquireDbByStb(pMnode, dropReq.name);
467,228✔
3242
  if (pDb == NULL) {
467,228✔
3243
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
3244
    goto _OVER;
×
3245
  }
3246

3247
  SName   name = {0};
467,228✔
3248
  int32_t ret = 0;
467,228✔
3249
  if ((ret = tNameFromString(&name, dropReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0)
467,228✔
3250
    mError("stb:%s, failed to tNameFromString since %s", dropReq.name, tstrerror(ret));
×
3251

3252
  // if ((code = mndCheckDbPrivilege(pMnode, RPC_MSG_USER(pReq), MND_OPER_WRITE_DB, pDb)) != 0) {
3253
  //   goto _OVER;
3254
  // }
3255
  TAOS_CHECK_GOTO(mndAcquireUser(pMnode, RPC_MSG_USER(pReq), &pOperUser), NULL, _OVER);
467,228✔
3256
  TAOS_CHECK_GOTO(mndCheckDbPrivilege(pMnode, RPC_MSG_USER(pReq), RPC_MSG_TOKEN(pReq), MND_OPER_USE_DB, pDb), NULL,
467,228✔
3257
                  _OVER);
3258
  TAOS_CHECK_GOTO(
467,228✔
3259
      mndCheckObjPrivilegeRecF(pMnode, pOperUser, PRIV_CM_DROP, PRIV_OBJ_TBL, pStb->ownerId, pDb->name, name.tname),
3260
      NULL, _OVER);
3261
  if ((code = mndCheckDropStbForTopic(pMnode, dropReq.name, pStb->uid)) != 0) {
467,228✔
3262
    goto _OVER;
×
3263
  }
3264

3265
  if (pDb->cfg.isMount) {
467,228✔
3266
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
275✔
3267
    goto _OVER;
275✔
3268
  }
3269

3270
  code = mndDropStb(pMnode, pReq, pDb, pStb);
466,953✔
3271
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
466,953✔
3272

3273
  if (tsAuditLevel >= AUDIT_LEVEL_DATABASE) {
466,953✔
3274
    int64_t tse = taosGetTimestampMs();
466,953✔
3275
    double  duration = (double)(tse - tss);
466,953✔
3276
    duration = duration / 1000;
466,953✔
3277
    auditRecord(pReq, pMnode->clusterId, "dropStb", name.dbname, name.tname, dropReq.sql, dropReq.sqlLen, duration, 0);
466,953✔
3278
  }
3279
_OVER:
897,125✔
3280
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
897,818✔
3281
    mError("stb:%s, failed to drop since %s", dropReq.name, tstrerror(code));
1,384✔
3282
  }
3283

3284
  mndReleaseDb(pMnode, pDb);
897,818✔
3285
  mndReleaseStb(pMnode, pStb);
897,818✔
3286
  mndReleaseUser(pMnode, pOperUser);
897,818✔
3287
  tFreeSMDropStbReq(&dropReq);
897,818✔
3288
  TAOS_RETURN(code);
897,818✔
3289
}
3290

3291
static int32_t mndProcessTableMetaReq(SRpcMsg *pReq) {
18,480,233✔
3292
  SMnode       *pMnode = pReq->info.node;
18,480,233✔
3293
  int32_t       code = -1;
18,480,233✔
3294
  STableInfoReq infoReq = {0};
18,480,233✔
3295
  STableMetaRsp metaRsp = {0};
18,480,233✔
3296
  SUserObj     *pUser = NULL;
18,479,839✔
3297

3298
  code = mndAcquireUser(pMnode, RPC_MSG_USER(pReq), &pUser);
18,480,233✔
3299
  if (pUser == NULL) return 0;
18,480,233✔
3300
  bool sysinfo = pUser->sysInfo;
18,480,233✔
3301

3302
  TAOS_CHECK_GOTO(tDeserializeSTableInfoReq(pReq->pCont, pReq->contLen, &infoReq), NULL, _OVER);
18,480,233✔
3303

3304
  if (0 == strcmp(infoReq.dbFName, TSDB_INFORMATION_SCHEMA_DB)) {
18,480,233✔
3305
    mInfo("information_schema table:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
1,928,557✔
3306
    TAOS_CHECK_GOTO(mndBuildInsTableSchema(pMnode, infoReq.dbFName, infoReq.tbName, sysinfo, &metaRsp), NULL, _OVER);
1,928,557✔
3307
  } else if (0 == strcmp(infoReq.dbFName, TSDB_PERFORMANCE_SCHEMA_DB)) {
16,551,676✔
3308
    mInfo("performance_schema table:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
143,160✔
3309
    TAOS_CHECK_GOTO(mndBuildPerfsTableSchema(pMnode, infoReq.dbFName, infoReq.tbName, &metaRsp), NULL, _OVER);
143,160✔
3310
  } else {
3311
    mInfo("stb:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
16,408,516✔
3312
    TAOS_CHECK_GOTO(mndBuildStbSchema(pMnode, infoReq.dbFName, infoReq.tbName, &metaRsp, true), NULL, _OVER);
16,408,516✔
3313
  }
3314

3315
  int32_t rspLen = tSerializeSTableMetaRsp(NULL, 0, &metaRsp);
17,565,113✔
3316
  if (rspLen < 0) {
17,565,113✔
3317
    code = TSDB_CODE_INVALID_MSG;
×
3318
    goto _OVER;
×
3319
  }
3320

3321
  void *pRsp = rpcMallocCont(rspLen);
17,565,113✔
3322
  if (pRsp == NULL) {
17,565,113✔
3323
    code = terrno;
×
3324
    goto _OVER;
×
3325
  }
3326

3327
  if ((rspLen = tSerializeSTableMetaRsp(pRsp, rspLen, &metaRsp)) < 0) {
17,565,113✔
3328
    code = rspLen;
×
3329
    goto _OVER;
×
3330
  }
3331
  pReq->info.rsp = pRsp;
17,565,113✔
3332
  pReq->info.rspLen = rspLen;
17,565,113✔
3333
  code = 0;
17,565,113✔
3334

3335
  mTrace("%s.%s, meta is retrieved", infoReq.dbFName, infoReq.tbName);
17,565,113✔
3336

3337
_OVER:
18,480,038✔
3338
  if (code != 0) {
18,480,233✔
3339
    mError("stb:%s.%s, failed to retrieve meta since %s", infoReq.dbFName, infoReq.tbName, tstrerror(code));
915,120✔
3340
  }
3341

3342
  mndReleaseUser(pMnode, pUser);
18,480,233✔
3343
  tFreeSTableMetaRsp(&metaRsp);
18,480,233✔
3344
  // TODO change to TAOS_RETURN
3345
  return code;
18,479,624✔
3346
}
3347

3348
static int32_t mndProcessTableCfgReq(SRpcMsg *pReq) {
31,729✔
3349
  SMnode      *pMnode = pReq->info.node;
31,729✔
3350
  int32_t      code = -1;
31,729✔
3351
  STableCfgReq cfgReq = {0};
31,729✔
3352
  STableCfgRsp cfgRsp = {0};
31,729✔
3353

3354
  TAOS_CHECK_GOTO(tDeserializeSTableCfgReq(pReq->pCont, pReq->contLen, &cfgReq), NULL, _OVER);
31,729✔
3355

3356
  char dbName[TSDB_DB_NAME_LEN] = {0};
31,729✔
3357
  TAOS_CHECK_GOTO(mndExtractShortDbNameFromDbFullName(cfgReq.dbFName, dbName), NULL, _OVER);
31,729✔
3358
  if (0 == strcmp(dbName, TSDB_INFORMATION_SCHEMA_DB)) {
31,729✔
3359
    mInfo("information_schema table:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
3,660✔
3360
    TAOS_CHECK_GOTO(mndBuildInsTableCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
3,660✔
3361
  } else if (0 == strcmp(dbName, TSDB_PERFORMANCE_SCHEMA_DB)) {
28,069✔
3362
    mInfo("performance_schema table:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
1,830✔
3363
    TAOS_CHECK_GOTO(mndBuildPerfsTableCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
1,830✔
3364
  } else {
3365
    mInfo("stb:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
26,239✔
3366
    TAOS_CHECK_GOTO(mndBuildStbCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
26,239✔
3367
  }
3368

3369
  int32_t rspLen = tSerializeSTableCfgRsp(NULL, 0, &cfgRsp);
31,729✔
3370
  if (rspLen < 0) {
31,729✔
3371
    code = TSDB_CODE_INVALID_MSG;
×
3372
    goto _OVER;
×
3373
  }
3374

3375
  void *pRsp = rpcMallocCont(rspLen);
31,729✔
3376
  if (pRsp == NULL) {
31,729✔
3377
    code = terrno;
×
3378
    goto _OVER;
×
3379
  }
3380

3381
  if ((rspLen = tSerializeSTableCfgRsp(pRsp, rspLen, &cfgRsp)) < 0) {
31,729✔
3382
    code = rspLen;
×
3383
    goto _OVER;
×
3384
  }
3385
  pReq->info.rsp = pRsp;
31,729✔
3386
  pReq->info.rspLen = rspLen;
31,729✔
3387
  code = 0;
31,729✔
3388

3389
  mTrace("%s.%s, cfg is retrieved", cfgReq.dbFName, cfgReq.tbName);
31,729✔
3390

3391
_OVER:
31,729✔
3392
  if (code != 0) {
31,729✔
3393
    mError("stb:%s.%s, failed to retrieve cfg since %s", cfgReq.dbFName, cfgReq.tbName, tstrerror(code));
×
3394
  }
3395

3396
  tFreeSTableCfgRsp(&cfgRsp);
31,729✔
3397
  TAOS_RETURN(code);
31,729✔
3398
}
3399

3400
int32_t mndValidateStbInfo(SMnode *pMnode, SSTableVersion *pStbVersions, int32_t numOfStbs, void **ppRsp,
6,011,454✔
3401
                           int32_t *pRspLen) {
3402
  int32_t   code = 0;
6,011,454✔
3403
  SSTbHbRsp hbRsp = {0};
6,011,454✔
3404
  hbRsp.pMetaRsp = taosArrayInit(numOfStbs, sizeof(STableMetaRsp));
6,011,454✔
3405
  if (hbRsp.pMetaRsp == NULL) {
6,011,454✔
3406
    code = terrno;
×
3407
    TAOS_RETURN(code);
×
3408
  }
3409

3410
  hbRsp.pIndexRsp = taosArrayInit(numOfStbs, sizeof(STableIndexRsp));
6,011,454✔
3411
  if (NULL == hbRsp.pIndexRsp) {
6,011,454✔
3412
    taosArrayDestroy(hbRsp.pMetaRsp);
×
3413
    code = terrno;
×
3414
    TAOS_RETURN(code);
×
3415
  }
3416

3417
  for (int32_t i = 0; i < numOfStbs; ++i) {
14,453,109✔
3418
    SSTableVersion *pStbVersion = &pStbVersions[i];
8,441,655✔
3419
    pStbVersion->suid = be64toh(pStbVersion->suid);
8,441,655✔
3420
    pStbVersion->sversion = ntohl(pStbVersion->sversion);
8,441,655✔
3421
    pStbVersion->tversion = ntohl(pStbVersion->tversion);
8,441,655✔
3422
    pStbVersion->smaVer = ntohl(pStbVersion->smaVer);
8,441,655✔
3423

3424
    bool    schema = false;
8,441,655✔
3425
    bool    sma = false;
8,441,655✔
3426
    int32_t code = mndValidateStbVersion(pMnode, pStbVersion, &schema, &sma);
8,441,655✔
3427
    if (TSDB_CODE_SUCCESS != code) {
8,441,655✔
3428
      STableMetaRsp metaRsp = {0};
39,092✔
3429
      metaRsp.numOfColumns = -1;
39,092✔
3430
      metaRsp.suid = pStbVersion->suid;
39,092✔
3431
      tstrncpy(metaRsp.dbFName, pStbVersion->dbFName, sizeof(metaRsp.dbFName));
39,092✔
3432
      tstrncpy(metaRsp.tbName, pStbVersion->stbName, sizeof(metaRsp.tbName));
39,092✔
3433
      tstrncpy(metaRsp.stbName, pStbVersion->stbName, sizeof(metaRsp.stbName));
39,092✔
3434
      if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
78,184✔
3435
        code = terrno;
×
3436
        return code;
×
3437
      }
3438
      continue;
39,092✔
3439
    }
3440

3441
    if (schema) {
8,402,563✔
3442
      STableMetaRsp metaRsp = {0};
37,660✔
3443
      mInfo("stb:%s.%s, start to retrieve meta", pStbVersion->dbFName, pStbVersion->stbName);
37,660✔
3444
      if (mndBuildStbSchema(pMnode, pStbVersion->dbFName, pStbVersion->stbName, &metaRsp, false) != 0) {
37,660✔
3445
        metaRsp.numOfColumns = -1;
×
3446
        metaRsp.suid = pStbVersion->suid;
×
3447
        tstrncpy(metaRsp.dbFName, pStbVersion->dbFName, sizeof(metaRsp.dbFName));
×
3448
        tstrncpy(metaRsp.tbName, pStbVersion->stbName, sizeof(metaRsp.tbName));
×
3449
        tstrncpy(metaRsp.stbName, pStbVersion->stbName, sizeof(metaRsp.stbName));
×
3450
        if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
×
3451
          code = terrno;
×
3452
          return code;
×
3453
        }
3454
        continue;
×
3455
      }
3456

3457
      if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
75,320✔
3458
        code = terrno;
×
3459
        return code;
×
3460
      }
3461
    }
3462

3463
    if (sma) {
8,402,563✔
3464
      bool           exist = false;
×
3465
      char           tbFName[TSDB_TABLE_FNAME_LEN];
×
3466
      STableIndexRsp indexRsp = {0};
×
3467
      indexRsp.pIndex = taosArrayInit(10, sizeof(STableIndexInfo));
×
3468
      if (NULL == indexRsp.pIndex) {
×
3469
        code = terrno;
×
3470
        TAOS_RETURN(code);
×
3471
      }
3472

3473
      (void)snprintf(tbFName, sizeof(tbFName), "%s.%s", pStbVersion->dbFName, pStbVersion->stbName);
×
3474
      tstrncpy(indexRsp.dbFName, pStbVersion->dbFName, sizeof(indexRsp.dbFName));
×
3475
      tstrncpy(indexRsp.tbName, pStbVersion->stbName, sizeof(indexRsp.tbName));
×
3476

3477
      if (taosArrayPush(hbRsp.pIndexRsp, &indexRsp) == NULL) {
×
3478
        code = terrno;
×
3479
        return code;
×
3480
      }
3481
    }
3482
  }
3483

3484
  int32_t rspLen = tSerializeSSTbHbRsp(NULL, 0, &hbRsp);
6,011,454✔
3485
  if (rspLen < 0) {
6,011,454✔
3486
    tFreeSSTbHbRsp(&hbRsp);
×
3487
    code = TSDB_CODE_INVALID_MSG;
×
3488
    TAOS_RETURN(code);
×
3489
  }
3490

3491
  void *pRsp = taosMemoryMalloc(rspLen);
6,011,454✔
3492
  if (pRsp == NULL) {
6,011,454✔
3493
    tFreeSSTbHbRsp(&hbRsp);
×
3494
    code = terrno;
×
3495
    TAOS_RETURN(code);
×
3496
  }
3497

3498
  rspLen = tSerializeSSTbHbRsp(pRsp, rspLen, &hbRsp);
6,011,454✔
3499
  tFreeSSTbHbRsp(&hbRsp);
6,010,854✔
3500
  if (rspLen < 0) return rspLen;
6,010,854✔
3501
  *ppRsp = pRsp;
6,010,854✔
3502
  *pRspLen = rspLen;
6,010,854✔
3503
  TAOS_RETURN(code);
6,011,454✔
3504
}
3505

3506
int32_t mndGetNumOfStbs(SMnode *pMnode, char *dbName, int32_t *pNumOfStbs) {
1,991,314✔
3507
  int32_t code = 0;
1,991,314✔
3508
  SSdb   *pSdb = pMnode->pSdb;
1,991,314✔
3509
  SDbObj *pDb = mndAcquireDb(pMnode, dbName);
1,991,314✔
3510
  if (pDb == NULL) {
1,991,314✔
3511
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
3512
    TAOS_RETURN(code);
×
3513
  }
3514

3515
  int32_t numOfStbs = 0;
1,991,314✔
3516
  void   *pIter = NULL;
1,991,314✔
3517
  while (1) {
31,238,353✔
3518
    SStbObj *pStb = NULL;
33,229,667✔
3519
    pIter = sdbFetch(pSdb, SDB_STB, pIter, (void **)&pStb);
33,229,667✔
3520
    if (pIter == NULL) break;
33,229,667✔
3521

3522
    if (pStb->dbUid == pDb->uid) {
31,238,353✔
3523
      numOfStbs++;
20,980,041✔
3524
    }
3525

3526
    sdbRelease(pSdb, pStb);
31,238,353✔
3527
  }
3528

3529
  *pNumOfStbs = numOfStbs;
1,991,314✔
3530
  mndReleaseDb(pMnode, pDb);
1,991,314✔
3531
  TAOS_RETURN(code);
1,991,314✔
3532
}
3533

3534
int32_t mndExtractDbNameFromStbFullName(const char *stbFullName, char *dst) {
×
3535
  SName name = {0};
×
3536
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
×
3537

3538
  TAOS_CHECK_RETURN(tNameGetFullDbName(&name, dst));
×
3539

3540
  return 0;
×
3541
}
3542

3543
int32_t mndExtractShortDbNameFromStbFullName(const char *stbFullName, char *dst) {
×
3544
  SName name = {0};
×
3545
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
×
3546

3547
  TAOS_CHECK_RETURN(tNameGetDbName(&name, dst));
×
3548

3549
  return 0;
×
3550
}
3551

3552
int32_t mndExtractShortDbNameFromDbFullName(const char *stbFullName, char *dst) {
31,729✔
3553
  SName name = {0};
31,729✔
3554
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB));
31,729✔
3555

3556
  TAOS_CHECK_RETURN(tNameGetDbName(&name, dst));
31,729✔
3557

3558
  return 0;
31,729✔
3559
}
3560

3561
void mndExtractTbNameFromStbFullName(const char *stbFullName, char *dst, int32_t dstSize) {
2,856,828✔
3562
  int32_t pos = -1;
2,856,828✔
3563
  int32_t num = 0;
2,856,828✔
3564
  for (pos = 0; stbFullName[pos] != 0; ++pos) {
24,733,922✔
3565
    if (stbFullName[pos] == TS_PATH_DELIMITER[0]) num++;
24,733,922✔
3566
    if (num == 2) break;
24,733,922✔
3567
  }
3568

3569
  if (num == 2) {
2,856,828✔
3570
    tstrncpy(dst, stbFullName + pos + 1, dstSize);
2,856,828✔
3571
  }
3572
}
2,856,828✔
3573

3574
static int32_t mndRetrieveStb(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
278,030✔
3575
  SMnode    *pMnode = pReq->info.node;
278,030✔
3576
  SSdb      *pSdb = pMnode->pSdb;
278,030✔
3577
  int32_t    numOfRows = 0;
278,030✔
3578
  SStbObj   *pStb = NULL;
278,030✔
3579
  SUserObj  *pOperUser = NULL;
278,030✔
3580
  SSHashObj *pUidNames = NULL;
278,030✔
3581
  int32_t    cols = 0;
278,030✔
3582
  int32_t    lino = 0;
278,030✔
3583
  int32_t    code = 0;
278,030✔
3584
  char       objFName[TSDB_OBJ_FNAME_LEN + 1] = {0};
278,030✔
3585
  bool       showAll = false;
278,030✔
3586

3587
  SDbObj *pDb = NULL;
278,030✔
3588
  if (strlen(pShow->db) > 0) {
278,030✔
3589
    pDb = mndAcquireDb(pMnode, pShow->db);
225,256✔
3590
    if (pDb == NULL) return terrno;
225,256✔
3591
  }
3592

3593
  if ((code = mndAcquireUser(pMnode, RPC_MSG_USER(pReq), &pOperUser)) != 0) {
276,719✔
3594
    goto _ERROR;
×
3595
  }
3596

3597
  (void)snprintf(objFName, sizeof(objFName), "%d.*", pOperUser->acctId);
276,719✔
3598
  showAll = (0 == mndCheckObjPrivilegeRecF(pMnode, pOperUser, PRIV_CM_SHOW, PRIV_OBJ_TBL, pDb ? pDb->ownerId : 0,
276,719✔
3599
                                           pDb ? pDb->name : objFName, "*"));
3600
  showAll = showAll && (0 == mndCheckDbPrivilegeByName(pMnode, RPC_MSG_USER(pReq), RPC_MSG_TOKEN(pReq), MND_OPER_USE_DB,
276,719✔
3601
                                                       pDb ? pDb->name : objFName, false));
3602

3603
  while (numOfRows < rows) {
2,147,990✔
3604
    pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb);
2,146,965✔
3605
    if (pShow->pIter == NULL) break;
2,146,965✔
3606

3607
    if (pDb != NULL && pStb->dbUid != pDb->uid) {
1,871,271✔
3608
      sdbRelease(pSdb, pStb);
935,833✔
3609
      continue;
935,833✔
3610
    }
3611

3612
    if (isTsmaResSTb(pStb->name)) {
935,438✔
3613
      sdbRelease(pSdb, pStb);
×
3614
      continue;
×
3615
    }
3616

3617
#if 0
3618
    if ((0 == pUser->superUser) && mndCheckStbPrivilege(pMnode, pUser, RPC_MSG_TOKEN(pReq), MND_OPER_SHOW_STB, pStb) != 0) {
3619
      sdbRelease(pSdb, pStb);
3620
      terrno = 0;
3621
      continue;
3622
    }
3623
#endif
3624
    cols = 0;
935,438✔
3625

3626
    SName name = {0};
935,438✔
3627

3628
    char stbName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
935,438✔
3629
    mndExtractTbNameFromStbFullName(pStb->name, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN);
935,438✔
3630

3631
    if (!showAll && (mndCheckObjPrivilegeRecF(pMnode, pOperUser, PRIV_CM_SHOW, PRIV_OBJ_TBL, pStb->ownerId, pStb->db,
935,438✔
3632
                                              &stbName[VARSTR_HEADER_SIZE]) ||
3,164✔
3633
                     mndCheckDbPrivilegeByName(pMnode, RPC_MSG_USER(pReq), RPC_MSG_TOKEN(pReq), MND_OPER_USE_DB,
3,164✔
3634
                                               pStb->db, false))) {
3,164✔
3635
      sdbRelease(pSdb, pStb);
2,002✔
3636
      terrno = 0;
2,002✔
3637
      continue;
2,002✔
3638
    }
3639

3640
    varDataSetLen(stbName, strlen(&stbName[VARSTR_HEADER_SIZE]));
933,436✔
3641
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
933,436✔
3642
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stbName, false), pStb, &lino, _ERROR);
933,436✔
3643

3644
    char db[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
933,436✔
3645
    RETRIEVE_CHECK_GOTO(tNameFromString(&name, pStb->db, T_NAME_ACCT | T_NAME_DB), pStb, &lino, _ERROR);
933,436✔
3646
    RETRIEVE_CHECK_GOTO(tNameGetDbName(&name, varDataVal(db)), pStb, &lino, _ERROR);
933,436✔
3647
    varDataSetLen(db, strlen(varDataVal(db)));
933,436✔
3648
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
933,436✔
3649
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)db, false), pStb, &lino, _ERROR);
933,436✔
3650

3651
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
933,436✔
3652
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->createdTime, false), pStb, &lino,
933,436✔
3653
                        _ERROR);
3654

3655
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
933,436✔
3656
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->numOfColumns, false), pStb, &lino,
933,436✔
3657
                        _ERROR);
3658

3659
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
933,436✔
3660
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->numOfTags, false), pStb, &lino, _ERROR);
933,436✔
3661

3662
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
933,436✔
3663
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->updateTime, false), pStb, &lino,
933,436✔
3664
                        _ERROR);  // number of tables
3665

3666
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
933,436✔
3667
    if (pStb->commentLen > 0) {
933,436✔
3668
      char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
19,093✔
3669
      STR_TO_VARSTR(comment, pStb->comment);
19,093✔
3670
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, comment, false), pStb, &lino, _ERROR);
19,093✔
3671
    } else if (pStb->commentLen == 0) {
914,343✔
3672
      char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
127,263✔
3673
      STR_TO_VARSTR(comment, "");
127,263✔
3674
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, comment, false), pStb, &lino, _ERROR);
127,263✔
3675
    } else {
3676
      colDataSetNULL(pColInfo, numOfRows);
787,080✔
3677
    }
3678

3679
    char watermark[64 + VARSTR_HEADER_SIZE] = {0};
933,436✔
3680
    (void)snprintf(varDataVal(watermark), sizeof(watermark) - VARSTR_HEADER_SIZE, "%" PRId64 "a,%" PRId64 "a",
1,864,727✔
3681
                   pStb->watermark[0], pStb->watermark[1]);
1,864,727✔
3682
    varDataSetLen(watermark, strlen(varDataVal(watermark)));
933,436✔
3683

3684
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
933,436✔
3685
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)watermark, false), pStb, &lino, _ERROR);
933,436✔
3686

3687
    char maxDelay[64 + VARSTR_HEADER_SIZE] = {0};
933,436✔
3688
    (void)snprintf(varDataVal(maxDelay), sizeof(maxDelay) - VARSTR_HEADER_SIZE, "%" PRId64 "a,%" PRId64 "a",
1,864,727✔
3689
                   pStb->maxdelay[0], pStb->maxdelay[1]);
1,864,727✔
3690
    varDataSetLen(maxDelay, strlen(varDataVal(maxDelay)));
933,436✔
3691

3692
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
933,436✔
3693
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)maxDelay, false), pStb, &lino, _ERROR);
933,436✔
3694

3695
    char    rollup[160 + VARSTR_HEADER_SIZE] = {0};
933,436✔
3696
    int32_t rollupNum = (int32_t)taosArrayGetSize(pStb->pFuncs);
933,436✔
3697
    char   *sep = ", ";
933,436✔
3698
    int32_t sepLen = strlen(sep);
933,436✔
3699
    int32_t rollupLen = sizeof(rollup) - VARSTR_HEADER_SIZE - 2;
933,436✔
3700
    for (int32_t i = 0; i < rollupNum; ++i) {
933,436✔
3701
      char *funcName = taosArrayGet(pStb->pFuncs, i);
×
3702
      if (i) {
×
3703
        (void)strncat(varDataVal(rollup), sep, rollupLen);
×
3704
        rollupLen -= sepLen;
×
3705
      }
3706
      (void)strncat(varDataVal(rollup), funcName, rollupLen);
×
3707
      rollupLen -= strlen(funcName);
×
3708
    }
3709
    varDataSetLen(rollup, strlen(varDataVal(rollup)));
933,436✔
3710

3711
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
933,436✔
3712
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)rollup, false), pStb, &lino, _ERROR);
933,436✔
3713

3714
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
933,436✔
3715
    if (pColInfo) {
933,436✔
3716
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->uid), false), pStb, &lino, _ERROR);
933,436✔
3717
    }
3718

3719
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
933,436✔
3720
    if (pColInfo) {
933,436✔
3721
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->virtualStb), false), pStb, &lino, _ERROR);
933,436✔
3722
    }
3723

3724
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
933,436✔
3725
    if (pColInfo) {
933,436✔
3726
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->keep), false), pStb, &lino, _ERROR);
933,436✔
3727
    }
3728

3729
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
933,436✔
3730
    if (pColInfo) {
933,436✔
3731
      if (!pUidNames) {
933,436✔
3732
        TAOS_CHECK_GOTO(mndBuildUidNamesHash(pMnode, &pUidNames), &lino, _OVER);
214,861✔
3733
      }
3734
      const char *ownerName = tSimpleHashGet(pUidNames, (const char *)&pStb->ownerId, sizeof(pStb->ownerId));
933,436✔
3735
      char        owner[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
933,436✔
3736
      STR_WITH_MAXSIZE_TO_VARSTR(owner, ownerName ? ownerName : "[unknown]", sizeof(owner));
933,436✔
3737
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)owner, false), pStb, &lino, _ERROR);
933,436✔
3738
    }
3739

3740
    numOfRows++;
933,436✔
3741
    sdbRelease(pSdb, pStb);
933,436✔
3742
  }
3743

3744
  if (pDb != NULL) {
276,719✔
3745
    mndReleaseDb(pMnode, pDb);
223,945✔
3746
  }
3747
  if (pOperUser != NULL) {
276,719✔
3748
    mndReleaseUser(pMnode, pOperUser);
276,719✔
3749
  }
3750

3751
  goto _OVER;
276,719✔
3752

3753
_ERROR:
×
3754
  if (pDb != NULL) {
×
3755
    mndReleaseDb(pMnode, pDb);
×
3756
  }
3757
  if (pOperUser != NULL) {
×
3758
    mndReleaseUser(pMnode, pOperUser);
×
3759
  }
3760
  mError("show:0x%" PRIx64 ", failed to retrieve data at %s:%d since %s", pShow->id, __FUNCTION__, lino,
×
3761
         tstrerror(code));
3762

3763
_OVER:
274,184✔
3764
  pShow->numOfRows += numOfRows;
276,719✔
3765
  tSimpleHashCleanup(pUidNames);
276,719✔
3766
  return numOfRows;
276,719✔
3767
}
3768

3769
static int32_t buildDbColsInfoBlock(const SSDataBlock *p, const SSysTableMeta *pSysDbTableMeta, size_t size,
1,809,324✔
3770
                                    const char *dbName, const char *tbName) {
3771
  char    tName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,809,324✔
3772
  char    dName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,809,324✔
3773
  char    typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,809,324✔
3774
  int32_t numOfRows = p->info.rows;
1,809,324✔
3775
  int32_t lino = 0;
1,809,324✔
3776
  int32_t code = 0;
1,809,324✔
3777

3778
  STR_TO_VARSTR(dName, dbName);
1,809,324✔
3779
  STR_TO_VARSTR(typeName, "SYSTEM_TABLE");
1,809,324✔
3780

3781
  for (int32_t i = 0; i < size; ++i) {
60,611,318✔
3782
    const SSysTableMeta *pm = &pSysDbTableMeta[i];
58,781,274✔
3783
    //    if (pm->sysInfo) {
3784
    //      continue;
3785
    //    }
3786
    if (tbName[0] && strncmp(tbName, pm->name, TSDB_TABLE_NAME_LEN) != 0) {
58,801,994✔
3787
      continue;
×
3788
    }
3789

3790
    STR_TO_VARSTR(tName, pm->name);
58,801,994✔
3791

3792
    for (int32_t j = 0; j < pm->colNum; j++) {
573,489,922✔
3793
      // table name
3794
      SColumnInfoData *pColInfoData = taosArrayGet(p->pDataBlock, 0);
514,687,928✔
3795
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, tName, false), &lino, _OVER);
514,668,244✔
3796

3797
      // database name
3798
      pColInfoData = taosArrayGet(p->pDataBlock, 1);
514,044,572✔
3799
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, dName, false), &lino, _OVER);
514,629,912✔
3800

3801
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
514,629,912✔
3802
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, typeName, false), &lino, _OVER);
514,629,394✔
3803

3804
      // col name
3805
      char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
514,644,416✔
3806
      STR_TO_VARSTR(colName, pm->schema[j].name);
514,638,200✔
3807
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
514,644,416✔
3808
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, colName, false), &lino, _OVER);
514,685,856✔
3809

3810
      // col type
3811
      int8_t colType = pm->schema[j].type;
514,658,402✔
3812
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
514,656,330✔
3813
      char colTypeStr[VARSTR_HEADER_SIZE + 32];
514,657,884✔
3814
      int  colTypeLen =
3815
          snprintf(varDataVal(colTypeStr), sizeof(colTypeStr) - VARSTR_HEADER_SIZE, "%s", tDataTypes[colType].name);
514,657,366✔
3816
      if (colType == TSDB_DATA_TYPE_VARCHAR) {
514,683,266✔
3817
        colTypeLen +=
269,558,196✔
3818
            snprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d)",
269,558,196✔
3819
                     (int32_t)(pm->schema[j].bytes - VARSTR_HEADER_SIZE));
269,554,570✔
3820
      } else if (colType == TSDB_DATA_TYPE_NCHAR) {
245,128,696✔
3821
        colTypeLen +=
×
3822
            snprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d)",
×
3823
                     (int32_t)((pm->schema[j].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
×
3824
      }
3825
      varDataSetLen(colTypeStr, colTypeLen);
514,686,892✔
3826
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, (char *)colTypeStr, false), &lino, _OVER);
514,611,782✔
3827

3828
      // col length
3829
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
514,663,064✔
3830
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, (const char *)&pm->schema[j].bytes, false), &lino, _OVER);
514,640,272✔
3831

3832
      // col precision, col scale, col nullable, col source
3833
      for (int32_t k = 6; k <= 10; ++k) {
2,147,483,647✔
3834
        pColInfoData = taosArrayGet(p->pDataBlock, k);
2,147,483,647✔
3835
        colDataSetNULL(pColInfoData, numOfRows);
2,147,483,647✔
3836
      }
3837

3838
      numOfRows += 1;
515,034,470✔
3839
    }
3840
  }
3841
  return numOfRows;
1,830,044✔
3842
_OVER:
×
3843
  mError("failed at %s:%d since %s", __FUNCTION__, lino, tstrerror(code));
×
3844
  return numOfRows;
×
3845
}
3846
#define BUILD_COL_FOR_INFO_DB 1
3847
#define BUILD_COL_FOR_PERF_DB 1 << 1
3848
#define BUILD_COL_FOR_USER_DB 1 << 2
3849
#define BUILD_COL_FOR_ALL_DB  (BUILD_COL_FOR_INFO_DB | BUILD_COL_FOR_PERF_DB | BUILD_COL_FOR_USER_DB)
3850

3851
static int32_t buildSysDbColsInfo(SSDataBlock *p, int8_t buildWhichDBs, char *tb) {
938,699✔
3852
  size_t               size = 0;
938,699✔
3853
  const SSysTableMeta *pSysDbTableMeta = NULL;
938,699✔
3854

3855
  if (buildWhichDBs & BUILD_COL_FOR_INFO_DB) {
938,699✔
3856
    getInfosDbMeta(&pSysDbTableMeta, &size);
904,662✔
3857
    p->info.rows = buildDbColsInfoBlock(p, pSysDbTableMeta, size, TSDB_INFORMATION_SCHEMA_DB, tb);
904,662✔
3858
  }
3859

3860
  if (buildWhichDBs & BUILD_COL_FOR_PERF_DB) {
938,699✔
3861
    getPerfDbMeta(&pSysDbTableMeta, &size);
904,662✔
3862
    p->info.rows = buildDbColsInfoBlock(p, pSysDbTableMeta, size, TSDB_PERFORMANCE_SCHEMA_DB, tb);
904,662✔
3863
  }
3864

3865
  return p->info.rows;
938,699✔
3866
}
3867

3868
static int8_t determineBuildColForWhichDBs(const char *db) {
942,395✔
3869
  int8_t buildWhichDBs;
3870
  if (!db[0])
942,395✔
3871
    buildWhichDBs = BUILD_COL_FOR_ALL_DB;
904,508✔
3872
  else {
3873
    char *p = strchr(db, '.');
37,887✔
3874
    if (p && strcmp(p + 1, TSDB_INFORMATION_SCHEMA_DB) == 0) {
37,887✔
3875
      buildWhichDBs = BUILD_COL_FOR_INFO_DB;
154✔
3876
    } else if (p && strcmp(p + 1, TSDB_PERFORMANCE_SCHEMA_DB) == 0) {
37,733✔
3877
      buildWhichDBs = BUILD_COL_FOR_PERF_DB;
154✔
3878
    } else {
3879
      buildWhichDBs = BUILD_COL_FOR_USER_DB;
37,579✔
3880
    }
3881
  }
3882
  return buildWhichDBs;
942,395✔
3883
}
3884

3885
static int32_t mndRetrieveStbCol(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
942,395✔
3886
  uint8_t  buildWhichDBs;
3887
  SMnode  *pMnode = pReq->info.node;
942,395✔
3888
  SSdb    *pSdb = pMnode->pSdb;
942,395✔
3889
  SStbObj *pStb = NULL;
942,395✔
3890
  int32_t  numOfRows = 0;
942,395✔
3891
  int32_t  lino = 0;
942,395✔
3892
  int32_t  code = 0;
942,395✔
3893

3894
  buildWhichDBs = determineBuildColForWhichDBs(pShow->db);
942,395✔
3895

3896
  if (!pShow->sysDbRsp) {
942,395✔
3897
    numOfRows = buildSysDbColsInfo(pBlock, buildWhichDBs, pShow->filterTb);
938,699✔
3898
    mDebug("mndRetrieveStbCol get system table cols, rows:%d, db:%s", numOfRows, pShow->db);
938,699✔
3899
    pShow->sysDbRsp = true;
938,699✔
3900
  }
3901

3902
  if (buildWhichDBs & BUILD_COL_FOR_USER_DB) {
942,395✔
3903
    SDbObj *pDb = NULL;
942,087✔
3904
    if (strlen(pShow->db) > 0) {
942,087✔
3905
      pDb = mndAcquireDb(pMnode, pShow->db);
37,579✔
3906
      if (pDb == NULL && TSDB_CODE_MND_DB_NOT_EXIST != terrno && pBlock->info.rows == 0) return terrno;
37,579✔
3907
    }
3908

3909
    char typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
942,087✔
3910
    STR_TO_VARSTR(typeName, "SUPER_TABLE");
942,087✔
3911
    bool fetch = pShow->restore ? false : true;
942,087✔
3912
    pShow->restore = false;
942,087✔
3913
    while (numOfRows < rows) {
2,767,654✔
3914
      if (fetch) {
2,767,654✔
3915
        pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb);
2,763,958✔
3916
        if (pShow->pIter == NULL) break;
2,763,958✔
3917
      } else {
3918
        fetch = true;
3,696✔
3919
        void *pKey = taosHashGetKey(pShow->pIter, NULL);
3,696✔
3920
        pStb = sdbAcquire(pSdb, SDB_STB, pKey);
3,696✔
3921
        if (!pStb) continue;
3,696✔
3922
      }
3923

3924
      if (pDb != NULL && pStb->dbUid != pDb->uid) {
1,829,263✔
3925
        sdbRelease(pSdb, pStb);
2,584✔
3926
        continue;
2,584✔
3927
      }
3928

3929
      SName name = {0};
1,826,679✔
3930
      char  stbName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,826,679✔
3931
      mndExtractTbNameFromStbFullName(pStb->name, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN);
1,826,679✔
3932
      if (pShow->filterTb[0] && strncmp(pShow->filterTb, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN) != 0) {
1,826,679✔
3933
        sdbRelease(pSdb, pStb);
×
3934
        continue;
×
3935
      }
3936

3937
      if ((numOfRows + pStb->numOfColumns) > rows) {
1,826,679✔
3938
        pShow->restore = true;
3,696✔
3939
        if (numOfRows == 0) {
3,696✔
3940
          mError("mndRetrieveStbCol failed to get stable cols since buf:%d less than result:%d, stable name:%s, db:%s",
×
3941
                 rows, pStb->numOfColumns, pStb->name, pStb->db);
3942
        }
3943
        sdbRelease(pSdb, pStb);
3,696✔
3944
        break;
3,696✔
3945
      }
3946

3947
      varDataSetLen(stbName, strlen(&stbName[VARSTR_HEADER_SIZE]));
1,822,465✔
3948

3949
      mDebug("mndRetrieveStbCol get stable cols, stable name:%s, db:%s", pStb->name, pStb->db);
1,822,983✔
3950

3951
      char db[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,822,983✔
3952
      RETRIEVE_CHECK_GOTO(tNameFromString(&name, pStb->db, T_NAME_ACCT | T_NAME_DB), pStb, &lino, _OVER);
1,822,983✔
3953
      RETRIEVE_CHECK_GOTO(tNameGetDbName(&name, varDataVal(db)), pStb, &lino, _OVER);
1,822,983✔
3954
      varDataSetLen(db, strlen(varDataVal(db)));
1,822,983✔
3955

3956
      for (int i = 0; i < pStb->numOfColumns; i++) {
33,370,444✔
3957
        int32_t          cols = 0;
31,547,461✔
3958
        SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
31,547,461✔
3959
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stbName, false), pStb, &lino, _OVER);
31,547,461✔
3960

3961
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
31,547,461✔
3962
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)db, false), pStb, &lino, _OVER);
31,547,461✔
3963

3964
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
31,547,461✔
3965
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, typeName, false), pStb, &lino, _OVER);
31,547,461✔
3966

3967
        // col name
3968
        char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
31,547,461✔
3969
        STR_TO_VARSTR(colName, pStb->pColumns[i].name);
31,547,461✔
3970
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
31,547,461✔
3971
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, colName, false), pStb, &lino, _OVER);
31,547,461✔
3972

3973
        // col type
3974
        int8_t colType = pStb->pColumns[i].type;
31,547,461✔
3975
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
31,547,461✔
3976
        char colTypeStr[VARSTR_HEADER_SIZE + 32];
31,547,461✔
3977
        int  colTypeLen =
3978
            snprintf(varDataVal(colTypeStr), sizeof(colTypeStr) - VARSTR_HEADER_SIZE, "%s", tDataTypes[colType].name);
31,547,461✔
3979
        if (colType == TSDB_DATA_TYPE_VARCHAR) {
31,547,461✔
3980
          colTypeLen +=
1,010,588✔
3981
              snprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE,
1,010,588✔
3982
                       "(%d)", (int32_t)(pStb->pColumns[i].bytes - VARSTR_HEADER_SIZE));
1,010,588✔
3983
        } else if (colType == TSDB_DATA_TYPE_NCHAR) {
30,536,873✔
3984
          colTypeLen +=
1,010,236✔
3985
              snprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE,
1,010,236✔
3986
                       "(%d)", (int32_t)((pStb->pColumns[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
1,010,236✔
3987
        } else if (IS_DECIMAL_TYPE(colType)) {
29,526,637✔
3988
          STypeMod typeMod = pStb->pExtSchemas[i].typeMod;
×
3989
          uint8_t prec = 0, scale = 0;
×
3990
          decimalFromTypeMod(typeMod, &prec, &scale);
×
3991
          colTypeLen += snprintf(varDataVal(colTypeStr) + colTypeLen,
×
3992
                                 sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d,%d)", prec, scale);
3993
        }
3994
        varDataSetLen(colTypeStr, colTypeLen);
31,547,461✔
3995
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (char *)colTypeStr, false), pStb, &lino, _OVER);
31,547,461✔
3996

3997
        // col length
3998
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
31,547,461✔
3999
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->pColumns[i].bytes, false), pStb,
31,547,461✔
4000
                            &lino, _OVER);
4001
        
4002
        // col precision, col scale, col nullable, col source
4003
        for (int32_t j = 6; j <= 9; ++j) {
157,736,787✔
4004
          pColInfo = taosArrayGet(pBlock->pDataBlock, j);
126,189,844✔
4005
          colDataSetNULL(pColInfo, numOfRows);
126,189,844✔
4006
        }
4007

4008
        // col id
4009
        pColInfo = taosArrayGet(pBlock->pDataBlock, 10);
31,546,943✔
4010
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->pColumns[i].colId, false), pStb,
31,547,461✔
4011
                            &lino, _OVER);
4012
        numOfRows++;
31,547,461✔
4013
      }
4014

4015
      sdbRelease(pSdb, pStb);
1,822,983✔
4016
    }
4017

4018
    if (pDb != NULL) {
942,087✔
4019
      mndReleaseDb(pMnode, pDb);
37,396✔
4020
    }
4021
  }
4022

4023
  mDebug("mndRetrieveStbCol success, rows:%d, pShow->numOfRows:%d", numOfRows, pShow->numOfRows);
942,395✔
4024
  goto _OVER;
942,395✔
4025

4026
_ERROR:
4027
  mError("failed to mndRetrieveStbCol, rows:%d, pShow->numOfRows:%d, at %s:%d since %s", numOfRows, pShow->numOfRows,
4028
         __FUNCTION__, lino, tstrerror(code));
4029

4030
_OVER:
942,395✔
4031
  pShow->numOfRows += numOfRows;
942,395✔
4032
  return numOfRows;
942,395✔
4033
}
4034

4035
static void mndCancelGetNextStb(SMnode *pMnode, void *pIter) {
154✔
4036
  SSdb *pSdb = pMnode->pSdb;
154✔
4037
  sdbCancelFetchByType(pSdb, pIter, SDB_STB);
154✔
4038
}
154✔
4039

4040
const char *mndGetStbStr(const char *src) {
×
4041
  char *posDb = strstr(src, TS_PATH_DELIMITER);
×
4042
  if (posDb != NULL) ++posDb;
×
4043
  if (posDb == NULL) return src;
×
4044

4045
  char *posStb = strstr(posDb, TS_PATH_DELIMITER);
×
4046
  if (posStb != NULL) ++posStb;
×
4047
  if (posStb == NULL) return posDb;
×
4048
  return posStb;
×
4049
}
4050

4051
static int32_t mndCheckIndexReq(SCreateTagIndexReq *pReq) {
×
4052
  // impl
4053
  return TSDB_CODE_SUCCESS;
×
4054
}
4055

4056
/*int32_t mndAddIndexImpl(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp, void *sql,
4057
                        int32_t len) {
4058
  // impl later
4059
  int32_t code = 0;
4060
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "create-stb-index");
4061
  if (pTrans == NULL) goto _OVER;
4062

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

4067
  if (mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb) != 0) goto _OVER;
4068
  if (mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb) != 0) goto _OVER;
4069
  if (mndSetAlterStbRedoActions2(pMnode, pTrans, pDb, pStb, sql, len) != 0) goto _OVER;
4070
  if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
4071

4072
  return code;
4073

4074
_OVER:
4075
  mndTransDrop(pTrans);
4076
  return code;
4077
}
4078
static int32_t mndAddIndex(SMnode *pMnode, SRpcMsg *pReq, SCreateTagIndexReq *tagIdxReq, SDbObj *pDb, SStbObj *pOld) {
4079
  bool    needRsp = true;
4080
  int32_t code = -1;
4081
  SField *pField0 = NULL;
4082

4083
  SStbObj  stbObj = {0};
4084
  SStbObj *pNew = &stbObj;
4085

4086
  taosRLockLatch(&pOld->lock);
4087
  memcpy(&stbObj, pOld, sizeof(SStbObj));
4088
  taosRUnLockLatch(&pOld->lock);
4089

4090
  stbObj.pColumns = NULL;
4091
  stbObj.pTags = NULL;
4092
  stbObj.updateTime = taosGetTimestampMs();
4093
  stbObj.lock = 0;
4094

4095
  int32_t tag = mndFindSuperTableTagIndex(pOld, tagIdxReq->colName);
4096
  if (tag < 0) {
4097
    terrno = TSDB_CODE_MND_TAG_NOT_EXIST;
4098
    return -1;
4099
  }
4100
  if (mndAllocStbSchemas(pOld, pNew) != 0) {
4101
    return -1;
4102
  }
4103

4104
  SSchema *pTag = pNew->pTags + tag;
4105
  if (IS_IDX_ON(pTag)) {
4106
    terrno = TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST;
4107
    return -1;
4108
  } else {
4109
    pTag->flags |= COL_IDX_ON;
4110
  }
4111
  pNew->tagVer++;
4112

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

4115
  return code;
4116
}
4117
static int32_t mndProcessCreateIndexReq(SRpcMsg *pReq) {
4118
  SMnode            *pMnode = pReq->info.node;
4119
  int32_t            code = -1;
4120
  SDbObj            *pDb = NULL;
4121
  SStbObj           *pStb = NULL;
4122
  SCreateTagIndexReq tagIdxReq = {0};
4123

4124
  if (tDeserializeSCreateTagIdxReq(pReq->pCont, pReq->contLen, &tagIdxReq) != 0) {
4125
    terrno = TSDB_CODE_INVALID_MSG;
4126
    goto _OVER;
4127
  }
4128

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

4131
  if (mndCheckIndexReq(&tagIdxReq) != TSDB_CODE_SUCCESS) {
4132
    goto _OVER;
4133
  }
4134

4135
  pDb = mndAcquireDbByStb(pMnode, tagIdxReq.dbFName);
4136
  if (pDb == NULL) {
4137
    terrno = TSDB_CODE_MND_DB_NOT_EXIST;
4138
    goto _OVER;
4139
  }
4140

4141
  pStb = mndAcquireStb(pMnode, tagIdxReq.stbName);
4142
  if (pStb == NULL) {
4143
    terrno = TSDB_CODE_MND_STB_NOT_EXIST;
4144
    goto _OVER;
4145
  }
4146
  if (mndCheckDbPrivilege(pMnode, RPC_MSG_USER(pReq), RPC_MSG_TOKEN(pReq), MND_OPER_WRITE_DB, pDb) != 0) {
4147
    goto _OVER;
4148
  }
4149

4150
  code = mndAddIndex(pMnode, pReq, &tagIdxReq, pDb, pStb);
4151
  if (terrno == TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST || terrno == TSDB_CODE_MND_TAG_NOT_EXIST) {
4152
    return terrno;
4153
  } else {
4154
    if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
4155
  }
4156
_OVER:
4157
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
4158
    mError("stb:%s, failed to create index since %s", tagIdxReq.stbName, terrstr());
4159
  }
4160
  mndReleaseStb(pMnode, pStb);
4161
  mndReleaseDb(pMnode, pDb);
4162
  return code;
4163
}
4164
static int32_t mndProcessDropIndexReq(SRpcMsg *pReq) {
4165
  SMnode          *pMnode = pReq->info.node;
4166
  int32_t          code = -1;
4167
  SDbObj          *pDb = NULL;
4168
  SStbObj         *pStb = NULL;
4169
  SDropTagIndexReq dropReq = {0};
4170
  if (tDeserializeSDropTagIdxReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
4171
    terrno = TSDB_CODE_INVALID_MSG;
4172
    goto _OVER;
4173
  }
4174
  //
4175
  return TSDB_CODE_SUCCESS;
4176
_OVER:
4177
  return code;
4178
}*/
4179

4180
static int32_t mndProcessDropStbReqFromMNode(SRpcMsg *pReq) {
2,249✔
4181
  int32_t code = mndProcessDropStbReq(pReq);
2,249✔
4182
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
2,249✔
4183
    pReq->info.rsp = rpcMallocCont(1);
×
4184
    pReq->info.rspLen = 1;
×
4185
    pReq->info.noResp = false;
×
4186
    pReq->code = code;
×
4187
  }
4188
  return code;
2,249✔
4189
}
4190

4191
typedef struct SVDropTbVgReqs {
4192
  SArray     *pBatchReqs;
4193
  SVgroupInfo info;
4194
} SVDropTbVgReqs;
4195

4196
typedef struct SMDropTbDbInfo {
4197
  SArray *dbVgInfos;
4198
  int32_t hashPrefix;
4199
  int32_t hashSuffix;
4200
  int32_t hashMethod;
4201
} SMDropTbDbInfo;
4202

4203
typedef struct SMDropTbTsmaInfo {
4204
  char           tsmaResTbDbFName[TSDB_DB_FNAME_LEN];
4205
  char           tsmaResTbNamePrefix[TSDB_TABLE_FNAME_LEN];
4206
  int32_t        suid;
4207
  SMDropTbDbInfo dbInfo;  // reference to DbInfo in pDbMap
4208
} SMDropTbTsmaInfo;
4209

4210
typedef struct SMDropTbTsmaInfos {
4211
  SArray *pTsmaInfos;  // SMDropTbTsmaInfo
4212
} SMDropTbTsmaInfos;
4213

4214
typedef struct SMndDropTbsWithTsmaCtx {
4215
  SHashObj *pVgMap;  // <vgId, SVDropTbVgReqs>
4216
} SMndDropTbsWithTsmaCtx;
4217

4218
static int32_t mndDropTbForSingleVg(SMnode *pMnode, SMndDropTbsWithTsmaCtx *pCtx, SArray *pTbs, int32_t vgId);
4219

4220
static void destroySVDropTbBatchReqs(void *p);
4221
static void mndDestroyDropTbsWithTsmaCtx(SMndDropTbsWithTsmaCtx *p) {
12,144✔
4222
  if (!p) return;
12,144✔
4223

4224
  if (p->pVgMap) {
12,144✔
4225
    void *pIter = taosHashIterate(p->pVgMap, NULL);
12,144✔
4226
    while (pIter) {
24,288✔
4227
      SVDropTbVgReqs *pReqs = pIter;
12,144✔
4228
      taosArrayDestroyEx(pReqs->pBatchReqs, destroySVDropTbBatchReqs);
12,144✔
4229
      pIter = taosHashIterate(p->pVgMap, pIter);
12,144✔
4230
    }
4231
    taosHashCleanup(p->pVgMap);
12,144✔
4232
  }
4233
  taosMemoryFree(p);
12,144✔
4234
}
4235

4236
static int32_t mndInitDropTbsWithTsmaCtx(SMndDropTbsWithTsmaCtx **ppCtx) {
12,144✔
4237
  int32_t                 code = 0;
12,144✔
4238
  SMndDropTbsWithTsmaCtx *pCtx = taosMemoryCalloc(1, sizeof(SMndDropTbsWithTsmaCtx));
12,144✔
4239
  if (!pCtx) return terrno;
12,144✔
4240

4241
  pCtx->pVgMap = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_NO_LOCK);
12,144✔
4242
  if (!pCtx->pVgMap) {
12,144✔
4243
    code = terrno;
×
4244
    goto _end;
×
4245
  }
4246

4247
  *ppCtx = pCtx;
12,144✔
4248
_end:
12,144✔
4249
  if (code) mndDestroyDropTbsWithTsmaCtx(pCtx);
12,144✔
4250
  return code;
12,144✔
4251
}
4252

4253
static void *mndBuildVDropTbsReq(SMnode *pMnode, const SVgroupInfo *pVgInfo, const SVDropTbBatchReq *pReq,
35,136✔
4254
                                 int32_t *len) {
4255
  int32_t   contLen = 0;
35,136✔
4256
  int32_t   ret = 0;
35,136✔
4257
  SMsgHead *pHead = NULL;
35,136✔
4258
  SEncoder  encoder = {0};
35,136✔
4259

4260
  tEncodeSize(tEncodeSVDropTbBatchReq, pReq, contLen, ret);
35,136✔
4261
  if (ret < 0) return NULL;
35,136✔
4262

4263
  contLen += sizeof(SMsgHead);
35,136✔
4264
  pHead = taosMemoryMalloc(contLen);
35,136✔
4265
  if (pHead == NULL) {
35,136✔
4266
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
4267
    return NULL;
×
4268
  }
4269

4270
  pHead->contLen = htonl(contLen);
35,136✔
4271
  pHead->vgId = htonl(pVgInfo->vgId);
35,136✔
4272

4273
  void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
35,136✔
4274

4275
  tEncoderInit(&encoder, pBuf, contLen - sizeof(SMsgHead));
35,136✔
4276
  int32_t code = tEncodeSVDropTbBatchReq(&encoder, pReq);
35,136✔
4277
  tEncoderClear(&encoder);
35,136✔
4278
  if (code != 0) return NULL;
35,136✔
4279

4280
  *len = contLen;
35,136✔
4281
  return pHead;
35,136✔
4282
}
4283

4284
static int32_t mndSetDropTbsRedoActions(SMnode *pMnode, STrans *pTrans, const SVDropTbVgReqs *pVgReqs, void *pCont,
35,136✔
4285
                                        int32_t contLen, tmsg_t msgType) {
4286
  STransAction action = {0};
35,136✔
4287
  action.epSet = pVgReqs->info.epSet;
35,136✔
4288
  action.pCont = pCont;
35,136✔
4289
  action.contLen = contLen;
35,136✔
4290
  action.msgType = msgType;
35,136✔
4291
  action.acceptableCode = TSDB_CODE_TDB_TABLE_NOT_EXIST;
35,136✔
4292
  return mndTransAppendRedoAction(pTrans, &action);
35,136✔
4293
}
4294

4295
static int32_t mndBuildDropTbRedoActions(SMnode *pMnode, STrans *pTrans, SHashObj *pVgMap, tmsg_t msgType) {
8,784✔
4296
  int32_t code = 0;
8,784✔
4297
  void   *pIter = taosHashIterate(pVgMap, NULL);
8,784✔
4298
  while (pIter) {
17,568✔
4299
    const SVDropTbVgReqs *pVgReqs = pIter;
8,784✔
4300
    int32_t               len = 0;
8,784✔
4301
    for (int32_t i = 0; i < taosArrayGetSize(pVgReqs->pBatchReqs) && code == TSDB_CODE_SUCCESS; ++i) {
43,920✔
4302
      SVDropTbBatchReq *pBatchReq = taosArrayGet(pVgReqs->pBatchReqs, i);
35,136✔
4303
      void             *p = mndBuildVDropTbsReq(pMnode, &pVgReqs->info, pBatchReq, &len);
35,136✔
4304
      if (!p) {
35,136✔
4305
        code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
4306
        if (terrno != 0) code = terrno;
×
4307
        break;
×
4308
      }
4309
      if ((code = mndSetDropTbsRedoActions(pMnode, pTrans, pVgReqs, p, len, msgType)) != 0) {
35,136✔
4310
        break;
×
4311
      }
4312
    }
4313
    if (TSDB_CODE_SUCCESS != code) {
8,784✔
4314
      taosHashCancelIterate(pVgMap, pIter);
×
4315
      break;
×
4316
    }
4317
    pIter = taosHashIterate(pVgMap, pIter);
8,784✔
4318
  }
4319
  return code;
8,784✔
4320
}
4321

4322
static int32_t mndCreateDropTbsTxnPrepare(SRpcMsg *pRsp, SMndDropTbsWithTsmaCtx *pCtx) {
12,144✔
4323
  int32_t code = 0;
12,144✔
4324
  SMnode *pMnode = pRsp->info.node;
12,144✔
4325
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, pRsp, "drop-tbs");
12,144✔
4326
  mndTransSetChangeless(pTrans);
12,144✔
4327
  mndTransSetSerial(pTrans);
12,144✔
4328
  if (pTrans == NULL) {
12,144✔
4329
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
4330
    if (terrno != 0) code = terrno;
×
4331
    goto _OVER;
×
4332
  }
4333

4334
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
12,144✔
4335

4336
  if ((code = mndBuildDropTbRedoActions(pMnode, pTrans, pCtx->pVgMap, TDMT_VND_DROP_TABLE)) != 0) goto _OVER;
8,784✔
4337
  if ((code = mndTransPrepare(pMnode, pTrans)) != 0) goto _OVER;
8,784✔
4338

4339
_OVER:
8,784✔
4340
  mndTransDrop(pTrans);
12,144✔
4341
  TAOS_RETURN(code);
12,144✔
4342
}
4343

4344
static int32_t mndProcessDropTbWithTsma(SRpcMsg *pReq) {
×
4345
  int32_t      code = -1;
×
4346
  SMnode      *pMnode = pReq->info.node;
×
4347
  SDbObj      *pDb = NULL;
×
4348
  SStbObj     *pStb = NULL;
×
4349
  SMDropTbsReq dropReq = {0};
×
4350
  bool         locked = false;
×
4351
  if (tDeserializeSMDropTbsReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
×
4352
    code = TSDB_CODE_INVALID_MSG;
×
4353
    goto _OVER;
×
4354
  }
4355

4356
  SMndDropTbsWithTsmaCtx *pCtx = NULL;
×
4357
  code = mndInitDropTbsWithTsmaCtx(&pCtx);
×
4358
  if (code) goto _OVER;
×
4359
  for (int32_t i = 0; i < dropReq.pVgReqs->size; ++i) {
×
4360
    SMDropTbReqsOnSingleVg *pReq = taosArrayGet(dropReq.pVgReqs, i);
×
4361
    code = mndDropTbForSingleVg(pMnode, pCtx, pReq->pTbs, pReq->vgInfo.vgId);
×
4362
    if (code) goto _OVER;
×
4363
  }
4364
  code = mndCreateDropTbsTxnPrepare(pReq, pCtx);
×
4365
  if (code == 0) {
×
4366
    code = TSDB_CODE_ACTION_IN_PROGRESS;
×
4367
  }
4368
_OVER:
×
4369
  tFreeSMDropTbsReq(&dropReq);
×
4370
  if (pCtx) mndDestroyDropTbsWithTsmaCtx(pCtx);
×
4371
  TAOS_RETURN(code);
×
4372
}
4373

4374
static int32_t createDropTbBatchReq(const SVDropTbReq *pReq, SVDropTbBatchReq *pBatchReq) {
49,920✔
4375
  pBatchReq->nReqs = 1;
49,920✔
4376
  pBatchReq->pArray = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SVDropTbReq));
49,920✔
4377
  if (!pBatchReq->pArray) return terrno;
49,920✔
4378
  if (taosArrayPush(pBatchReq->pArray, pReq) == NULL) {
99,840✔
4379
    taosArrayDestroy(pBatchReq->pArray);
×
4380
    pBatchReq->pArray = NULL;
×
4381
    return terrno;
×
4382
  }
4383
  return TSDB_CODE_SUCCESS;
49,920✔
4384
}
4385

4386
static void destroySVDropTbBatchReqs(void *p) {
49,920✔
4387
  SVDropTbBatchReq *pReq = p;
49,920✔
4388
  taosArrayDestroy(pReq->pArray);
49,920✔
4389
  pReq->pArray = NULL;
49,920✔
4390
}
49,920✔
4391

4392
static int32_t mndDropTbAdd(SMnode *pMnode, SHashObj *pVgHashMap, const SVgroupInfo *pVgInfo, char *name, tb_uid_t suid,
49,920✔
4393
                            bool ignoreNotExists) {
4394
  SVDropTbReq req = {.name = name, .suid = suid, .igNotExists = ignoreNotExists, .uid = 0};
49,920✔
4395

4396
  SVDropTbVgReqs *pVgReqs = taosHashGet(pVgHashMap, &pVgInfo->vgId, sizeof(pVgInfo->vgId));
49,920✔
4397
  SVDropTbVgReqs  vgReqs = {0};
49,920✔
4398
  if (pVgReqs == NULL) {
49,920✔
4399
    vgReqs.info = *pVgInfo;
12,144✔
4400
    vgReqs.pBatchReqs = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SVDropTbBatchReq));
12,144✔
4401
    if (!vgReqs.pBatchReqs) return terrno;
12,144✔
4402
    SVDropTbBatchReq batchReq = {0};
12,144✔
4403
    int32_t          code = createDropTbBatchReq(&req, &batchReq);
12,144✔
4404
    if (TSDB_CODE_SUCCESS != code) return code;
12,144✔
4405
    if (taosArrayPush(vgReqs.pBatchReqs, &batchReq) == NULL) {
24,288✔
4406
      taosArrayDestroy(batchReq.pArray);
×
4407
      return terrno;
×
4408
    }
4409
    if (taosHashPut(pVgHashMap, &pVgInfo->vgId, sizeof(pVgInfo->vgId), &vgReqs, sizeof(vgReqs)) != 0) {
12,144✔
4410
      taosArrayDestroyEx(vgReqs.pBatchReqs, destroySVDropTbBatchReqs);
×
4411
      return terrno;
×
4412
    }
4413
  } else {
4414
    SVDropTbBatchReq batchReq = {0};
37,776✔
4415
    int32_t          code = createDropTbBatchReq(&req, &batchReq);
37,776✔
4416
    if (TSDB_CODE_SUCCESS != code) return code;
37,776✔
4417
    if (taosArrayPush(pVgReqs->pBatchReqs, &batchReq) == NULL) {
75,552✔
4418
      taosArrayDestroy(batchReq.pArray);
×
4419
      return terrno;
×
4420
    }
4421
  }
4422
  return 0;
49,920✔
4423
}
4424

4425
static int32_t mndDropTbForSingleVg(SMnode *pMnode, SMndDropTbsWithTsmaCtx *pCtx, SArray *pTbs, int32_t vgId) {
12,144✔
4426
  int32_t code = 0;
12,144✔
4427

4428
  SVgObj *pVgObj = mndAcquireVgroup(pMnode, vgId);
12,144✔
4429
  if (!pVgObj) {
12,144✔
4430
    code = 0;
×
4431
    goto _end;
×
4432
  }
4433
  SVgroupInfo vgInfo = {.hashBegin = pVgObj->hashBegin,
24,288✔
4434
                        .hashEnd = pVgObj->hashEnd,
12,144✔
4435
                        .numOfTable = pVgObj->numOfTables,
12,144✔
4436
                        .vgId = pVgObj->vgId};
12,144✔
4437
  vgInfo.epSet = mndGetVgroupEpset(pMnode, pVgObj);
12,144✔
4438
  mndReleaseVgroup(pMnode, pVgObj);
12,144✔
4439

4440
  for (int32_t i = 0; i < pTbs->size; ++i) {
62,064✔
4441
    SVDropTbReq *pTb = taosArrayGet(pTbs, i);
49,920✔
4442
    TAOS_CHECK_GOTO(mndDropTbAdd(pMnode, pCtx->pVgMap, &vgInfo, pTb->name, pTb->suid, pTb->igNotExists), NULL, _end);
49,920✔
4443
  }
4444
_end:
12,144✔
4445
  return code;
12,144✔
4446
}
4447

4448
static int32_t mndProcessFetchTtlExpiredTbs(SRpcMsg *pRsp) {
12,936,688✔
4449
  int32_t                 code = -1;
12,936,688✔
4450
  SDecoder                decoder = {0};
12,936,688✔
4451
  SMnode                 *pMnode = pRsp->info.node;
12,936,688✔
4452
  SVFetchTtlExpiredTbsRsp rsp = {0};
12,936,688✔
4453
  SMndDropTbsWithTsmaCtx *pCtx = NULL;
12,936,688✔
4454
  if (pRsp->code != TSDB_CODE_SUCCESS) {
12,936,688✔
4455
    code = pRsp->code;
128,788✔
4456
    goto _end;
128,788✔
4457
  }
4458
  if (pRsp->contLen == 0) {
12,807,900✔
4459
    code = 0;
12,795,756✔
4460
    goto _end;
12,795,756✔
4461
  }
4462

4463
  tDecoderInit(&decoder, pRsp->pCont, pRsp->contLen);
12,144✔
4464
  code = tDecodeVFetchTtlExpiredTbsRsp(&decoder, &rsp);
12,144✔
4465
  if (code) goto _end;
12,144✔
4466

4467
  code = mndInitDropTbsWithTsmaCtx(&pCtx);
12,144✔
4468
  if (code) goto _end;
12,144✔
4469

4470
  code = mndDropTbForSingleVg(pMnode, pCtx, rsp.pExpiredTbs, rsp.vgId);
12,144✔
4471
  if (code) goto _end;
12,144✔
4472
  code = mndCreateDropTbsTxnPrepare(pRsp, pCtx);
12,144✔
4473
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
12,144✔
4474
_end:
12,935,701✔
4475
  if (pCtx) mndDestroyDropTbsWithTsmaCtx(pCtx);
12,936,688✔
4476
  tDecoderClear(&decoder);
12,936,688✔
4477
  tFreeFetchTtlExpiredTbsRsp(&rsp);
12,936,688✔
4478
  TAOS_RETURN(code);
12,936,688✔
4479
}
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