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

taosdata / TDengine / #5024

16 Apr 2026 10:31AM UTC coverage: 72.954% (+0.7%) from 72.251%
#5024

push

travis-ci

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

120 of 200 new or added lines in 14 files covered. (60.0%)

655 existing lines in 130 files now uncovered.

273150 of 374416 relevant lines covered (72.95%)

129604715.8 hits per line

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

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

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

37
#define STB_VER_SUPPORT_COMP    2
38
#define STB_VER_SUPPORT_VIRTUAL 3
39
#define STB_VER_SUPPORT_OWNER   4
40
#define STB_VER_NUMBER          STB_VER_SUPPORT_OWNER
41
#define STB_RESERVE_SIZE        55
42

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

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

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

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

111
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STB, mndRetrieveStb);
467,104✔
112
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_STB, mndCancelGetNextStb);
467,104✔
113

114
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_COL, mndRetrieveStbCol);
467,104✔
115
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_COL, mndCancelGetNextStb);
467,104✔
116

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

120
void mndCleanupStb(SMnode *pMnode) {}
467,042✔
121

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

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

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

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

167
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
107,717,870✔
168
    SSchema *pSchema = &pStb->pTags[i];
91,630,507✔
169
    SDB_SET_INT8(pRaw, dataPos, pSchema->type, _OVER)
91,630,507✔
170
    SDB_SET_INT8(pRaw, dataPos, pSchema->flags, _OVER)
91,630,507✔
171
    SDB_SET_INT16(pRaw, dataPos, pSchema->colId, _OVER)
91,630,507✔
172
    SDB_SET_INT32(pRaw, dataPos, pSchema->bytes, _OVER)
91,630,507✔
173
    SDB_SET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
91,630,507✔
174
  }
175

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

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

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

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

193
  if (pStb->pCmpr != NULL) {
16,087,363✔
194
    for (int i = 0; i < pStb->numOfColumns; i++) {
999,596,484✔
195
      SColCmpr *p = &pStb->pCmpr[i];
983,509,121✔
196
      SDB_SET_INT16(pRaw, dataPos, p->id, _OVER)
983,509,121✔
197
      SDB_SET_INT32(pRaw, dataPos, p->alg, _OVER)
983,509,121✔
198
    }
199
  }
200
  SDB_SET_INT64(pRaw, dataPos, pStb->keep, _OVER)
16,087,363✔
201

202
  if (hasTypeMod) {
16,087,363✔
203
    for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
633,475,913✔
204
      SDB_SET_INT32(pRaw, dataPos, pStb->pExtSchemas[i].typeMod, _OVER);
628,143,700✔
205
    }
206
  }
207

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

216
  terrno = 0;
16,087,363✔
217

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

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

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

237
  int8_t sver = 0;
15,226,777✔
238
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
15,226,777✔
239

240
  if (sver > STB_VER_NUMBER) {
15,226,777✔
241
    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
×
242
    goto _OVER;
×
243
  }
244

245
  pRow = sdbAllocRow(sizeof(SStbObj));
15,226,777✔
246
  if (pRow == NULL) goto _OVER;
15,226,777✔
247

248
  pStb = sdbGetRowObj(pRow);
15,226,777✔
249
  if (pStb == NULL) goto _OVER;
15,226,777✔
250

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

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

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

291
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
159,817,782✔
292
    SSchema *pSchema = &pStb->pTags[i];
144,591,005✔
293
    SDB_GET_INT8(pRaw, dataPos, &pSchema->type, _OVER)
144,591,005✔
294
    SDB_GET_INT8(pRaw, dataPos, &pSchema->flags, _OVER)
144,591,005✔
295
    SDB_GET_INT16(pRaw, dataPos, &pSchema->colId, _OVER)
144,591,005✔
296
    SDB_GET_INT32(pRaw, dataPos, &pSchema->bytes, _OVER)
144,591,005✔
297
    SDB_GET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
144,591,005✔
298
  }
299

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

312
  if (pStb->ast1Len > 0) {
15,226,777✔
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) {
15,226,777✔
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));
15,226,777✔
325
  if (sver < STB_VER_SUPPORT_COMP) {
15,226,777✔
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,659,641,885✔
336
      SColCmpr *pCmpr = &pStb->pCmpr[i];
1,644,415,108✔
337
      SDB_GET_INT16(pRaw, dataPos, &pCmpr->id, _OVER)
1,644,415,108✔
338
      SDB_GET_INT32(pRaw, dataPos, (int32_t *)&pCmpr->alg, _OVER)  // compatiable
1,644,415,108✔
339
    }
340
  }
341
  SDB_GET_INT64(pRaw, dataPos, &pStb->keep, _OVER)
15,226,777✔
342

343
  // type mod
344
  if (hasExtSchemas) {
15,226,777✔
345
    pStb->pExtSchemas = taosMemoryCalloc(pStb->numOfColumns, sizeof(SExtSchema));
6,711,835✔
346
    if (!pStb->pExtSchemas) goto _OVER;
6,711,835✔
347
    for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
1,380,738,629✔
348
      SSchema *pSchema = &pStb->pColumns[i];
1,374,026,794✔
349
      SDB_GET_INT32(pRaw, dataPos, &pStb->pExtSchemas[i].typeMod, _OVER)
1,374,026,794✔
350
    }
351
  }
352

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

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

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

372
  SDB_GET_RESERVE(pRaw, dataPos, STB_RESERVE_SIZE, _OVER)
15,226,777✔
373

374
  terrno = 0;
15,226,777✔
375

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

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

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

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

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

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

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

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

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

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

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

518
END:
4,968,587✔
519
  taosWUnLockLatch(&pOld->lock);
11,616,379✔
520
  return terrno;
11,616,379✔
521
}
522

523
SStbObj *mndAcquireStb(SMnode *pMnode, char *stbName) {
36,541,946✔
524
  SSdb    *pSdb = pMnode->pSdb;
36,541,946✔
525
  SStbObj *pStb = sdbAcquire(pSdb, SDB_STB, stbName);
36,542,555✔
526
  if (pStb == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
36,542,555✔
527
    terrno = TSDB_CODE_MND_STB_NOT_EXIST;
3,242,958✔
528
  }
529
  return pStb;
36,542,555✔
530
}
531

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

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

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

544
  return mndAcquireDb(pMnode, db);
8,389,902✔
545
}
546

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

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

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

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

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

593
  req.colCmpr.pColCmpr = taosMemoryCalloc(pCmpr->nCols, sizeof(SColCmpr));
11,212,805✔
594
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
961,385,901✔
595
    SColCmpr *p = &pCmpr->pColCmpr[i];
950,173,096✔
596
    p->alg = pStb->pCmpr[i].alg;
950,173,096✔
597
    p->id = pStb->pCmpr[i].id;
950,173,096✔
598
  }
599

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

608
  contLen += sizeof(SMsgHead);
11,212,805✔
609

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

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

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

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

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

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

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

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

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

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

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

680
  *pContLen = contLen;
5,459,118✔
681
  return pHead;
5,459,118✔
682
}
683

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

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

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

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

707
  SField *pField = taosArrayGet(pCreate->pColumns, 0);
2,083,188✔
708
  if (pField->type != TSDB_DATA_TYPE_TIMESTAMP) {
2,083,188✔
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,232,733✔
714
    SFieldWithOptions *pField1 = taosArrayGet(pCreate->pColumns, i);
157,149,545✔
715
    if (pField1->type >= TSDB_DATA_TYPE_MAX) {
157,149,545✔
716
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
717
      TAOS_RETURN(code);
×
718
    }
719
    if (pField1->bytes <= 0) {
157,149,545✔
720
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
721
      TAOS_RETURN(code);
×
722
    }
723
    if (pField1->name[0] == 0) {
157,149,545✔
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,645,348✔
730
    SField *pField1 = taosArrayGet(pCreate->pTags, i);
8,562,160✔
731
    if (pField1->type >= TSDB_DATA_TYPE_MAX) {
8,562,160✔
732
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
733
      TAOS_RETURN(code);
×
734
    }
735
    if (pField1->bytes <= 0) {
8,562,160✔
736
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
737
      TAOS_RETURN(code);
×
738
    }
739
    if (pField1->name[0] == 0) {
8,562,160✔
740
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
741
      TAOS_RETURN(code);
×
742
    }
743
  }
744

745
  TAOS_RETURN(code);
2,083,188✔
746
}
747

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

762
  TAOS_RETURN(code);
×
763
}
764

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

780
  TAOS_RETURN(code);
2,022,960✔
781
}
782

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

790
  while (1) {
8,985,453✔
791
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
11,006,489✔
792
    if (pIter == NULL) break;
11,006,489✔
793
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
8,985,453✔
794
      sdbRelease(pSdb, pVgroup);
4,482,154✔
795
      continue;
4,482,154✔
796
    }
797

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

825
  TAOS_RETURN(code);
2,021,036✔
826
}
827

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

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

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

854
  TAOS_RETURN(code);
×
855
}
856

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

863
  while (1) {
8,985,453✔
864
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
11,006,489✔
865
    if (pIter == NULL) break;
11,006,489✔
866
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
8,985,453✔
867
      sdbRelease(pSdb, pVgroup);
4,482,154✔
868
      continue;
4,482,154✔
869
    }
870

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

896
  TAOS_RETURN(code);
2,021,036✔
897
}
898

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

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

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

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

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

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

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

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

993
  for (int32_t i = 0; i < pDst->numOfTags; ++i) {
10,325,961✔
994
    SField  *pField = taosArrayGet(pCreate->pTags, i);
8,299,187✔
995
    SSchema *pSchema = &pDst->pTags[i];
8,299,187✔
996
    pSchema->type = pField->type;
8,299,187✔
997
    pSchema->bytes = pField->bytes;
8,299,187✔
998
    if (i == 0) {
8,299,187✔
999
      SSCHMEA_SET_IDX_ON(pSchema);
2,026,774✔
1000
    }
1001
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
8,299,187✔
1002
    pSchema->colId = pDst->nextColId;
8,299,187✔
1003
    pDst->nextColId++;
8,299,187✔
1004
  }
1005
  // set col compress
1006
  pDst->pCmpr = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SCmprObj));
2,026,774✔
1007
  for (int32_t i = 0; i < pDst->numOfColumns; i++) {
121,897,694✔
1008
    SFieldWithOptions *pField = taosArrayGet(pCreate->pColumns, i);
119,870,920✔
1009
    SSchema           *pSchema = &pDst->pColumns[i];
119,870,920✔
1010

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

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

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

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

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

1055

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

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

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

1082
  TAOS_CHECK_GOTO(mndAddStbToTrans(pMnode, pTrans, pDb, &stbObj), NULL, _OVER);
1,956,565✔
1083
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
1,950,827✔
1084
  code = 0;
1,950,640✔
1085

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

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

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

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

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

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

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

1199
  int32_t contLen;
238✔
1200

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

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

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

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

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

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

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

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

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

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

1273
  code = 0;
238✔
1274

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

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

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

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

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

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

1302
  return code;
440✔
1303
}
1304

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

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

1324
  mDebug("start to process ttl timer");
3,400,856✔
1325

1326
  while (1) {
13,170,608✔
1327
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
16,571,464✔
1328
    if (pIter == NULL) break;
16,571,464✔
1329

1330
    if (pVgroup->mountVgId) {
13,170,608✔
1331
      sdbRelease(pSdb, pVgroup);
1,144✔
1332
      continue;
1,144✔
1333
    }
1334

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

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

1361
  return 0;
3,400,856✔
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,651,090✔
1420
  for (int32_t tag = 0; tag < pStb->numOfTags; tag++) {
28,840,229✔
1421
    if (strcmp(pStb->pTags[tag].name, tagName) == 0) {
26,106,471✔
1422
      return tag;
917,332✔
1423
    }
1424
  }
1425

1426
  return -1;
2,733,758✔
1427
}
1428

1429
static int32_t mndFindSuperTableColumnIndex(const SStbObj *pStb, const char *colName) {
5,735,930✔
1430
  for (int32_t col = 0; col < pStb->numOfColumns; col++) {
326,911,508✔
1431
    if (strcmp(pStb->pColumns[col].name, colName) == 0) {
324,101,725✔
1432
      return col;
2,926,147✔
1433
    }
1434
  }
1435

1436
  return -1;
2,809,783✔
1437
}
1438

1439
static bool mndValidateSchema(SSchema *pSchemas, int32_t nSchema, SArray *pFields, int32_t maxLen) {
3,003,683✔
1440
  int32_t rowLen = 0;
3,003,683✔
1441
  for (int32_t i = 0; i < nSchema; ++i) {
203,684,652✔
1442
    rowLen += (pSchemas + i)->bytes;
200,680,969✔
1443
  }
1444

1445
  int32_t nField = taosArrayGetSize(pFields);
3,003,683✔
1446
  for (int32_t i = 0; i < nField; ++i) {
6,007,366✔
1447
    rowLen += ((SField *)TARRAY_GET_ELEM(pFields, i))->bytes;
3,003,683✔
1448
  }
1449

1450
  return rowLen <= maxLen;
3,003,683✔
1451
}
1452

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

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

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

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

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

1493
  for (int32_t i = 0; i < pDst->numOfTags; ++i) {
236,836✔
1494
    SField  *pField = taosArrayGet(createReq->pTags, i);
201,855✔
1495
    SSchema *pSchema = &pDst->pTags[i];
201,855✔
1496
    pSchema->type = pField->type;
201,855✔
1497
    pSchema->bytes = pField->bytes;
201,855✔
1498
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
201,855✔
1499
    int32_t cIndex = mndFindSuperTableTagIndex(pStb, pField->name);
201,855✔
1500
    if (cIndex >= 0) {
201,855✔
1501
      pSchema->colId = pStb->pTags[cIndex].colId;
190,677✔
1502
    } else {
1503
      pSchema->colId = pDst->nextColId++;
11,178✔
1504
    }
1505
  }
1506
  for (int32_t i = 0; i < pDst->numOfColumns; i++) {
252,922✔
1507
    SColCmpr          *p = pDst->pCmpr + i;
217,941✔
1508
    SFieldWithOptions *pField = taosArrayGet(createReq->pColumns, i);
217,941✔
1509
    SSchema           *pSchema = &pDst->pColumns[i];
217,941✔
1510
    p->id = pSchema->colId;
217,941✔
1511
    if (pField->compress == 0) {
217,941✔
1512
      p->alg = createDefaultColCmprByType(pSchema->type);
×
1513
    } else {
1514
      p->alg = pField->compress;
217,941✔
1515
    }
1516
    if (pField->flags & COL_HAS_TYPE_MOD) {
217,941✔
1517
      pDst->pExtSchemas[i].typeMod = pField->typeMod;
4,592✔
1518
    }
1519
  }
1520
  pDst->tagVer = createReq->tagVer;
34,981✔
1521
  pDst->colVer = createReq->colVer;
34,981✔
1522
  return TSDB_CODE_SUCCESS;
34,981✔
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){
34,981✔
1527
  SMAlterStbReq alterReq = {0};
34,981✔
1528
  alterReq.pFields = taosArrayInit(2, sizeof(SField));
34,981✔
1529
  if (NULL == alterReq.pFields) {
34,981✔
1530
    mError("failed to init alter fields array");
×
1531
    goto END;
×
1532
  }
1533
  tstrncpy(alterReq.name, pStb->name, TSDB_TABLE_FNAME_LEN);
34,981✔
1534
  for (int32_t i = 0; i < pDst->numOfColumns && taosArrayGetSize(alterReq.pFields) == 0; ++i) {
243,858✔
1535
    SSchema           *pSchema = &pDst->pColumns[i];
208,877✔
1536
    int32_t cIndex = mndFindSuperTableColumnIndex(pStb, pSchema->name);
208,877✔
1537
    if (cIndex >= 0 && pSchema->bytes == pStb->pColumns[cIndex].bytes) {
208,877✔
1538
      continue;
188,974✔
1539
    }
1540
    if (cIndex < 0) {
19,903✔
1541
      alterReq.alterType = TSDB_ALTER_TABLE_ADD_COLUMN;
16,290✔
1542
    } else if (pSchema->bytes > pStb->pColumns[cIndex].bytes){
3,613✔
1543
      alterReq.alterType = TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES;
3,613✔
1544
    }
1545
    SField *pAlterField = taosArrayReserve(alterReq.pFields, 1);
19,903✔
1546
    pAlterField->type = pSchema->type;
19,903✔
1547
    pAlterField->bytes = pSchema->bytes;
19,903✔
1548
    tstrncpy(pAlterField->name, pSchema->name, TSDB_COL_NAME_LEN);
19,903✔
1549
    mDebug("alter column name:%s, type:%d, bytes:%d", pAlterField->name, pAlterField->type, pAlterField->bytes);
19,903✔
1550
  }
1551

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

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

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

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

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

1619
  pStb = mndAcquireStb(pMnode, createReq.name);
2,012,979✔
1620
  if (pStb != NULL) {
2,012,979✔
1621
    if (createReq.igExists) {
54,900✔
1622
      if (createReq.source == TD_REQ_FROM_APP) {
53,545✔
1623
        mInfo("stb:%s, already exist, ignore exist is set", createReq.name);
3,548✔
1624
        code = 0;
3,548✔
1625
        goto _OVER;
3,548✔
1626
      } else if (pStb->uid != createReq.suid) {
49,997✔
1627
        mInfo("stb:%s, alter table does not need to be done, because table is deleted", createReq.name);
×
1628
        code = 0;
×
1629
        goto _OVER;
×
1630
      } else if (createReq.tagVer > 0 || createReq.colVer > 0) {
84,978✔
1631
        int32_t tagDelta = createReq.tagVer - pStb->tagVer;
49,997✔
1632
        int32_t colDelta = createReq.colVer - pStb->colVer;
49,997✔
1633
        mInfo("stb:%s, already exist while create, input tagVer:%d colVer:%d, exist tagVer:%d colVer:%d",
49,997✔
1634
              createReq.name, createReq.tagVer, createReq.colVer, pStb->tagVer, pStb->colVer);
1635
        if (tagDelta <= 0 && colDelta <= 0) {
49,997✔
1636
          mInfo("stb:%s, schema version is not incremented and nothing needs to be done", createReq.name);
15,016✔
1637
          code = 0;
15,016✔
1638
          goto _OVER;
15,016✔
1639
        } else if ((tagDelta == 1 && colDelta == 0) || (tagDelta == 0 && colDelta == 1) ||
34,981✔
1640
                   (pStb->colVer == 1 && createReq.colVer > 1) || (pStb->tagVer == 1 && createReq.tagVer > 1)) {
×
1641
          isAlter = true;
34,981✔
1642
          mInfo("stb:%s, schema version is only increased by 1 number, do alter operation", createReq.name);
34,981✔
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,355✔
1656
      goto _OVER;
1,355✔
1657
    }
1658
  } else if (terrno != TSDB_CODE_MND_STB_NOT_EXIST) {
1,958,079✔
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,958,079✔
1661
             (createReq.tagVer != 1 || createReq.colVer != 1)) {
17,145✔
1662
    mInfo("stb:%s, alter table does not need to be done, because table is deleted", createReq.name);
287✔
1663
    code = 0;
287✔
1664
    goto _OVER;
287✔
1665
  }
1666

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

1674
  for (int32_t i = 0; i < createReq.numOfColumns; ++i) {
158,745,878✔
1675
    SFieldWithOptions *pField = taosArrayGet(createReq.pColumns, i);
156,753,105✔
1676
    if ((code = taosHashPut(pHash, pField->name, strlen(pField->name), NULL, 0)) != 0) {
156,753,105✔
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,378,207✔
1685
    SField *pField = taosArrayGet(createReq.pTags, i);
8,385,533✔
1686
    if ((code = taosHashPut(pHash, pField->name, strlen(pField->name), NULL, 0)) != 0) {
8,385,533✔
1687
      if (code == TSDB_CODE_DUP_KEY) {
99✔
1688
        code = TSDB_CODE_TSC_DUP_COL_NAMES;
99✔
1689
      }
1690
      goto _OVER;
99✔
1691
    }
1692
  }
1693

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

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

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

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

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

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

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

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

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

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

1761
    int64_t tse = taosGetTimestampMs();
1,992,674✔
1762
    double  duration = (double)(tse - tss);
1,992,674✔
1763
    duration = duration / 1000;
1,992,674✔
1764
    if (createReq.sql == NULL && createReq.sqlLen == 0) {
1,993,565✔
1765
      char detail[1000] = {0};
403,546✔
1766

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

1769
      auditRecord(pReq, pMnode->clusterId, "createStb", name.dbname, name.tname, detail, strlen(detail), duration, 0);
403,546✔
1770
    } else {
1771
      auditRecord(pReq, pMnode->clusterId, "createStb", name.dbname, name.tname, createReq.sql, createReq.sqlLen,
1,589,128✔
1772
                  duration, 0);
1773
    }
1774
  }
1775
_OVER:
2,010,182✔
1776
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
2,012,979✔
1777
    mError("stb:%s, failed to create since %s", createReq.name, tstrerror(code));
8,507✔
1778
  }
1779

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

1785
  if (pHash != NULL) {
2,012,979✔
1786
    taosHashCleanup(pHash);
1,992,773✔
1787
  }
1788

1789
  TAOS_RETURN(code);
2,012,979✔
1790
}
1791

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

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

1834
  TAOS_RETURN(0);
5,569,777✔
1835
}
1836

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

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

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

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

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

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

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

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

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

1906
    if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
267,769✔
1907
      code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
65,196✔
1908
      TAOS_RETURN(code);
65,196✔
1909
    }
1910

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2040
  if (mndFindSuperTableTagIndex(pOld, newTagName) >= 0) {
112,807✔
2041
    code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
6,321✔
2042
    TAOS_RETURN(code);
6,321✔
2043
  }
2044

2045
  if (mndFindSuperTableColumnIndex(pOld, newTagName) >= 0) {
106,486✔
2046
    code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
99✔
2047
    TAOS_RETURN(code);
99✔
2048
  }
2049

2050
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
106,387✔
2051

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

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

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

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

2071
  uint32_t nLen = 0;
328,029✔
2072
  for (int32_t i = 0; i < pOld->numOfTags; ++i) {
13,095,681✔
2073
    nLen += (pOld->pTags[i].colId == colId) ? pField->bytes : pOld->pTags[i].bytes;
12,767,652✔
2074
  }
2075

2076
  if (nLen > TSDB_MAX_TAGS_LEN) {
328,029✔
2077
    code = TSDB_CODE_PAR_INVALID_TAGS_LENGTH;
195,364✔
2078
    TAOS_RETURN(code);
195,364✔
2079
  }
2080

2081
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
132,665✔
2082

2083
  SSchema *pTag = pNew->pTags + tag;
132,665✔
2084

2085
  if (!(pTag->type == TSDB_DATA_TYPE_BINARY || pTag->type == TSDB_DATA_TYPE_VARBINARY ||
132,665✔
2086
        pTag->type == TSDB_DATA_TYPE_NCHAR || pTag->type == TSDB_DATA_TYPE_GEOMETRY)) {
126,658✔
2087
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
99✔
2088
    TAOS_RETURN(code);
99✔
2089
  }
2090

2091
  if (pField->bytes <= pTag->bytes) {
132,566✔
2092
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
47,419✔
2093
    TAOS_RETURN(code);
47,419✔
2094
  }
2095

2096
  pTag->bytes = pField->bytes;
85,147✔
2097
  pNew->tagVer++;
85,147✔
2098

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

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

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

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

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

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

2137
  if (updated == 0) {
92,845✔
2138
    code = TSDB_CODE_MND_COLUMN_COMPRESS_ALREADY_EXIST;
8,029✔
2139
    TAOS_RETURN(code);
8,029✔
2140
  } else if (updated == -1) {
84,816✔
2141
    code = TSDB_CODE_TSC_COMPRESS_LEVEL_ERROR;
×
2142
    TAOS_RETURN(code);
×
2143
  }
2144

2145
  pNew->colVer++;
84,816✔
2146

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

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

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

2168
  pNew->numOfColumns = pNew->numOfColumns + ncols;
2,706,262✔
2169

2170
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
2,706,262✔
2171

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

2177
  for (int32_t i = 0; i < ncols; i++) {
5,103,663✔
2178
    if (withCompress) {
2,705,134✔
2179
      SFieldWithOptions *pField = taosArrayGet(pReq->pFields, i);
260,912✔
2180
      if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
260,912✔
2181
        code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
×
2182
        TAOS_RETURN(code);
×
2183
      }
2184

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

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

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

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

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

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

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

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

2266
  if (col == 0) {
1,606,355✔
2267
    code = TSDB_CODE_MND_INVALID_STB_ALTER_OPTION;
1,562✔
2268
    TAOS_RETURN(code);
1,562✔
2269
  }
2270

2271
  if (pOld->numOfColumns == 2) {
1,604,793✔
2272
    code = TSDB_CODE_PAR_INVALID_DROP_COL;
99✔
2273
    TAOS_RETURN(code);
99✔
2274
  }
2275

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

2279
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
1,604,694✔
2280

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

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

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

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

2304
  uint32_t nLen = 0;
523,729✔
2305
  int32_t  maxBytesPerRow = pOld->virtualStb ? TSDB_MAX_BYTES_PER_ROW_VIRTUAL : TSDB_MAX_BYTES_PER_ROW;
523,729✔
2306
  for (int32_t i = 0; i < pOld->numOfColumns; ++i) {
39,834,081✔
2307
    nLen += (pOld->pColumns[i].colId == colId) ? pField->bytes : pOld->pColumns[i].bytes;
39,310,352✔
2308
  }
2309

2310
  if (nLen > maxBytesPerRow) {
523,729✔
2311
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
27,815✔
2312
    TAOS_RETURN(code);
27,815✔
2313
  }
2314

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

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

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

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

2331
  pCol->bytes = pField->bytes;
287,508✔
2332
  pNew->colVer++;
287,508✔
2333

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

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

2352
  TAOS_RETURN(code);
4,827,411✔
2353
}
2354

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

2369
  TAOS_RETURN(code);
4,827,411✔
2370
}
2371

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

2380
  while (1) {
12,547,252✔
2381
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
17,374,663✔
2382
    if (pIter == NULL) break;
17,374,663✔
2383
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
12,547,252✔
2384
      sdbRelease(pSdb, pVgroup);
5,856,713✔
2385
      continue;
5,856,713✔
2386
    }
2387

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

2410
  TAOS_RETURN(code);
4,827,411✔
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,775,119✔
2455
  int32_t code = 0;
22,775,119✔
2456
  taosRLockLatch(&pStb->lock);
22,775,119✔
2457

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

2490
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
650,117,871✔
2491
    SSchema *pSchema = &pRsp->pSchemas[i];
627,342,752✔
2492
    SSchema *pSrcSchema = &pStb->pColumns[i];
627,342,752✔
2493
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
627,342,752✔
2494
    pSchema->type = pSrcSchema->type;
627,342,752✔
2495
    pSchema->flags = pSrcSchema->flags;
627,342,516✔
2496
    pSchema->colId = pSrcSchema->colId;
627,342,516✔
2497
    pSchema->bytes = pSrcSchema->bytes;
627,342,516✔
2498
  }
2499
  
2500
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
106,612,189✔
2501
    SSchema *pSchema = &pRsp->pSchemas[i + pStb->numOfColumns];
83,837,070✔
2502
    SSchema *pSrcSchema = &pStb->pTags[i];
83,837,070✔
2503
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
83,837,070✔
2504
    pSchema->type = pSrcSchema->type;
83,837,070✔
2505
    pSchema->flags = pSrcSchema->flags;
83,837,070✔
2506
    pSchema->colId = pSrcSchema->colId;
83,837,070✔
2507
    pSchema->bytes = pSrcSchema->bytes;
83,837,070✔
2508
  }
2509

2510
  if (refByStm) {
22,775,119✔
2511
    mndStreamUpdateTagsRefFlag(pMnode, pStb->uid, &pRsp->pSchemas[pStb->numOfColumns], pStb->numOfTags);
15,989,431✔
2512
  }
2513

2514
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
650,117,871✔
2515
    SColCmpr   *pCmpr = &pStb->pCmpr[i];
627,342,752✔
2516
    SSchemaExt *pSchEx = &pRsp->pSchemaExt[i];
627,342,752✔
2517
    pSchEx->colId = pCmpr->id;
627,342,752✔
2518
    pSchEx->compress = pCmpr->alg;
627,342,752✔
2519
    if (pStb->pExtSchemas) {
627,342,752✔
2520
      pSchEx->typeMod = pStb->pExtSchemas[i].typeMod;
322,533,401✔
2521
    }
2522
  }
2523

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

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

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

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

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

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

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

2581
  pRsp->pSchemaExt = taosMemoryCalloc(pStb->numOfColumns, sizeof(SSchemaExt));
28,830✔
2582
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
155,443✔
2583
    SColCmpr *pCmpr = &pStb->pCmpr[i];
126,613✔
2584

2585
    SSchemaExt *pSchExt = &pRsp->pSchemaExt[i];
126,613✔
2586
    pSchExt->colId = pCmpr->id;
126,613✔
2587
    pSchExt->compress = pCmpr->alg;
126,613✔
2588
    if (pStb->pExtSchemas) {
126,613✔
2589
      pSchExt->typeMod = pStb->pExtSchemas[i].typeMod;
30,662✔
2590
    }
2591
  }
2592
  pRsp->virtualStb = pStb->virtualStb;
28,830✔
2593
  pRsp->pColRefs = NULL;
28,830✔
2594
  pRsp->secureDelete = pStb->secureDelete;
28,830✔
2595

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

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

2605
  SDbObj *pDb = mndAcquireDb(pMnode, pStbVer->dbFName);
8,720,187✔
2606
  if (pDb == NULL) {
8,720,187✔
2607
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
30,056✔
2608
    TAOS_RETURN(code);
30,056✔
2609
  }
2610

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

2617
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
8,683,408✔
2618
  if (pStb == NULL) {
8,683,408✔
2619
    mndReleaseDb(pMnode, pDb);
5,371✔
2620
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
5,371✔
2621
    TAOS_RETURN(code);
5,371✔
2622
  }
2623

2624
  taosRLockLatch(&pStb->lock);
8,678,037✔
2625

2626
  if (pStbVer->sversion != pStb->colVer || pStbVer->tversion != pStb->tagVer) {
8,678,037✔
2627
    *schema = true;
24,930✔
2628
  } else {
2629
    *schema = false;
8,653,107✔
2630
  }
2631

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

2638
  taosRUnLockLatch(&pStb->lock);
8,678,037✔
2639

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

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

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

2656
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
16,768,126✔
2657
  if (pStb == NULL) {
16,768,126✔
2658
    mndReleaseDb(pMnode, pDb);
753,765✔
2659
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
753,765✔
2660
    TAOS_RETURN(code);
753,765✔
2661
  }
2662

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

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

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

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

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

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

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

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

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

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

2730
  tFreeSMAlterStbRsp(&alterRsp);
4,767,141✔
2731

2732
  if (code < 0) TAOS_RETURN(code);
4,767,141✔
2733

2734
  *pCont = cont;
4,767,141✔
2735
  *pLen = contLen;
4,767,141✔
2736

2737
  TAOS_RETURN(code);
4,767,141✔
2738
}
2739

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

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

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

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

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

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

2790
  tFreeSMCreateStbRsp(&stbRsp);
1,993,617✔
2791

2792
  *pCont = cont;
1,993,617✔
2793
  *pLen = contLen;
1,993,617✔
2794

2795
  code = 0;
1,993,617✔
2796

2797
_OVER:
1,995,181✔
2798
  if (pObj) {
1,995,181✔
2799
    mndReleaseStb(pMnode, pObj);
1,993,617✔
2800
  }
2801

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

2806
  TAOS_RETURN(code);
1,995,181✔
2807
}
2808

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

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

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

2835
  code = 0;
4,605,913✔
2836

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

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

2855
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
221,498✔
2856

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

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

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

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

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

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

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

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

2904
    TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
106,387✔
2905
    TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
106,387✔
2906
  }
2907
  code = 0;
221,498✔
2908

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

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

2919
  SStbObj stbObj = {0};
5,816,542✔
2920
  taosRLockLatch(&pOld->lock);
5,816,542✔
2921
  memcpy(&stbObj, pOld, sizeof(SStbObj));
5,816,542✔
2922
  taosRUnLockLatch(&pOld->lock);
5,816,542✔
2923
  stbObj.pColumns = NULL;
5,816,542✔
2924
  stbObj.pTags = NULL;
5,816,542✔
2925
  stbObj.pFuncs = NULL;
5,816,542✔
2926
  stbObj.pCmpr = NULL;
5,816,542✔
2927
  stbObj.pExtSchemas = NULL;
5,816,542✔
2928
  stbObj.updateTime = taosGetTimestampMs();
5,816,542✔
2929
  stbObj.lock = 0;
5,816,542✔
2930
  stbObj.virtualStb = pOld->virtualStb;
5,816,542✔
2931
  bool updateTagIndex = false;
5,816,542✔
2932
  switch (pAlter->alterType) {
5,816,542✔
2933
    case TSDB_ALTER_TABLE_ADD_TAG:
295,393✔
2934
      code = mndAddSuperTableTag(pOld, &stbObj, pAlter->pFields, pAlter->numOfFields);
295,393✔
2935
      break;
295,393✔
2936
    case TSDB_ALTER_TABLE_DROP_TAG:
115,333✔
2937
      pField0 = taosArrayGet(pAlter->pFields, 0);
115,333✔
2938
      code = mndDropSuperTableTag(pMnode, pOld, &stbObj, pField0->name);
115,333✔
2939
      updateTagIndex = true;
115,333✔
2940
      break;
115,333✔
2941
    case TSDB_ALTER_TABLE_UPDATE_TAG_NAME:
116,546✔
2942
      code = mndAlterStbTagName(pMnode, pOld, &stbObj, pAlter->pFields);
116,546✔
2943
      updateTagIndex = true;
116,546✔
2944
      break;
116,546✔
2945
    case TSDB_ALTER_TABLE_UPDATE_TAG_BYTES:
328,128✔
2946
      pField0 = taosArrayGet(pAlter->pFields, 0);
328,128✔
2947
      code = mndAlterStbTagBytes(pMnode, pOld, &stbObj, pField0);
328,128✔
2948
      break;
328,128✔
2949
    case TSDB_ALTER_TABLE_ADD_COLUMN:
2,447,378✔
2950
      code = mndAddSuperTableColumn(pOld, &stbObj, pAlter, pAlter->numOfFields, 0);
2,447,378✔
2951
      break;
2,447,378✔
2952
    case TSDB_ALTER_TABLE_DROP_COLUMN:
1,608,515✔
2953
      pField0 = taosArrayGet(pAlter->pFields, 0);
1,608,515✔
2954
      code = mndDropSuperTableColumn(pMnode, pOld, &stbObj, pField0->name);
1,608,515✔
2955
      break;
1,608,515✔
2956
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES:
523,927✔
2957
      pField0 = taosArrayGet(pAlter->pFields, 0);
523,927✔
2958
      code = mndAlterStbColumnBytes(pMnode, pOld, &stbObj, pField0);
523,927✔
2959
      break;
523,927✔
2960
    case TSDB_ALTER_TABLE_UPDATE_OPTIONS:
25,289✔
2961
      needRsp = false;
25,289✔
2962
      code = mndUpdateTableOptions(pOld, &stbObj, pAlter->comment, pAlter->commentLen, pAlter->ttl, pAlter->keep,
25,289✔
2963
                                   pAlter->secureDelete);
25,289✔
2964
      break;
25,289✔
2965
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_COMPRESS:
95,121✔
2966
      code = mndUpdateSuperTableColumnCompress(pMnode, pOld, &stbObj, pAlter->pFields, pAlter->numOfFields);
95,121✔
2967
      break;
95,121✔
2968
    case TSDB_ALTER_TABLE_ADD_COLUMN_WITH_COMPRESS_OPTION:
260,912✔
2969
      code = mndAddSuperTableColumn(pOld, &stbObj, pAlter, pAlter->numOfFields, 1);
260,912✔
2970
      break;
260,912✔
2971
    default:
×
2972
      needRsp = false;
×
2973
      terrno = TSDB_CODE_OPS_NOT_SUPPORT;
×
2974
      break;
×
2975
  }
2976

2977
  if (code != 0) goto _OVER;
5,816,542✔
2978
  if (updateTagIndex == false) {
4,910,054✔
2979
    code = mndAlterStbImp(pMnode, pReq, pDb, &stbObj, needRsp, pReq->pCont, pReq->contLen);
4,688,556✔
2980
  } else {
2981
    code = mndAlterStbAndUpdateTagIdxImp(pMnode, pReq, pDb, &stbObj, needRsp, pReq->pCont, pReq->contLen, pAlter);
221,498✔
2982
  }
2983

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

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

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

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

3012
  pDb = mndAcquireDbByStb(pMnode, alterReq.name);
5,832,088✔
3013
  if (pDb == NULL) {
5,832,088✔
3014
    code = TSDB_CODE_MND_DB_NOT_EXIST;
198✔
3015
    goto _OVER;
198✔
3016
  }
3017
  if (pDb->cfg.isMount) {
5,831,890✔
3018
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
278✔
3019
    goto _OVER;
278✔
3020
  }
3021

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

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

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

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

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

3062
  TAOS_RETURN(code);
5,832,088✔
3063
}
3064

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

3079
  TAOS_RETURN(code);
478,798✔
3080
}
3081

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

3096
  TAOS_RETURN(code);
478,798✔
3097
}
3098

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

3105
  while (1) {
1,309,730✔
3106
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
1,788,528✔
3107
    if (pIter == NULL) break;
1,788,528✔
3108
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
1,309,730✔
3109
      sdbRelease(pSdb, pVgroup);
353,911✔
3110
      continue;
353,911✔
3111
    }
3112

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

3137
  TAOS_RETURN(code);
478,798✔
3138
}
3139

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

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

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

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

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

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

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

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

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

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

3205
  pStb = mndAcquireStb(pMnode, dropReq.name);
916,421✔
3206
  if (pStb == NULL) {
916,421✔
3207
    if (dropReq.igNotExists) {
437,345✔
3208
      mInfo("stb:%s, not exist, ignore not exist is set", dropReq.name);
436,317✔
3209
      code = 0;
436,317✔
3210
      goto _OVER;
436,317✔
3211
    } else {
3212
      code = TSDB_CODE_MND_STB_NOT_EXIST;
1,028✔
3213
      goto _OVER;
1,028✔
3214
    }
3215
  }
3216

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

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

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

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

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

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

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

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

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

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

3280
  TAOS_CHECK_GOTO(tDeserializeSTableInfoReq(pReq->pCont, pReq->contLen, &infoReq), NULL, _OVER);
18,858,984✔
3281

3282
  if (0 == strcmp(infoReq.dbFName, TSDB_INFORMATION_SCHEMA_DB)) {
18,858,984✔
3283
    mInfo("information_schema table:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
1,970,290✔
3284
    TAOS_CHECK_GOTO(mndBuildInsTableSchema(pMnode, infoReq.dbFName, infoReq.tbName, sysinfo, &metaRsp), NULL, _OVER);
1,970,290✔
3285
  } else if (0 == strcmp(infoReq.dbFName, TSDB_PERFORMANCE_SCHEMA_DB)) {
16,888,694✔
3286
    mInfo("performance_schema table:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
145,498✔
3287
    TAOS_CHECK_GOTO(mndBuildPerfsTableSchema(pMnode, infoReq.dbFName, infoReq.tbName, &metaRsp), NULL, _OVER);
145,498✔
3288
  } else {
3289
    mInfo("stb:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
16,743,196✔
3290
    TAOS_CHECK_GOTO(mndBuildStbSchema(pMnode, infoReq.dbFName, infoReq.tbName, &metaRsp, true), NULL, _OVER);
16,743,196✔
3291
  }
3292

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

3299
  void *pRsp = rpcMallocCont(rspLen);
17,929,334✔
3300
  if (pRsp == NULL) {
17,929,334✔
3301
    code = terrno;
×
3302
    goto _OVER;
×
3303
  }
3304

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

3313
  mTrace("%s.%s, meta is retrieved", infoReq.dbFName, infoReq.tbName);
17,929,334✔
3314

3315
_OVER:
18,858,885✔
3316
  if (code != 0) {
18,858,984✔
3317
    mError("stb:%s.%s, failed to retrieve meta since %s", infoReq.dbFName, infoReq.tbName, tstrerror(code));
929,650✔
3318
  }
3319

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

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

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

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

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

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

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

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

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

3374
  tFreeSTableCfgRsp(&cfgRsp);
34,440✔
3375
  TAOS_RETURN(code);
34,440✔
3376
}
3377

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

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

3395
  for (int32_t i = 0; i < numOfStbs; ++i) {
14,678,293✔
3396
    SSTableVersion *pStbVersion = &pStbVersions[i];
8,720,187✔
3397
    pStbVersion->suid = be64toh(pStbVersion->suid);
8,720,187✔
3398
    pStbVersion->sversion = ntohl(pStbVersion->sversion);
8,720,187✔
3399
    pStbVersion->tversion = ntohl(pStbVersion->tversion);
8,720,187✔
3400
    pStbVersion->smaVer = ntohl(pStbVersion->smaVer);
8,720,187✔
3401

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

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

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

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

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

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

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

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

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

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

3493
  int32_t numOfStbs = 0;
2,062,883✔
3494
  void   *pIter = NULL;
2,062,883✔
3495
  while (1) {
32,376,842✔
3496
    SStbObj *pStb = NULL;
34,439,725✔
3497
    pIter = sdbFetch(pSdb, SDB_STB, pIter, (void **)&pStb);
34,439,725✔
3498
    if (pIter == NULL) break;
34,439,725✔
3499

3500
    if (pStb->dbUid == pDb->uid) {
32,376,842✔
3501
      numOfStbs++;
21,614,969✔
3502
    }
3503

3504
    sdbRelease(pSdb, pStb);
32,376,842✔
3505
  }
3506

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

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

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

3518
  return 0;
×
3519
}
3520

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

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

3527
  return 0;
×
3528
}
3529

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

3534
  TAOS_CHECK_RETURN(tNameGetDbName(&name, dst));
34,440✔
3535

3536
  return 0;
34,440✔
3537
}
3538

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

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

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

3565
  SDbObj *pDb = NULL;
282,400✔
3566
  if (strlen(pShow->db) > 0) {
282,400✔
3567
    pDb = mndAcquireDb(pMnode, pShow->db);
228,092✔
3568
    if (pDb == NULL) return terrno;
228,092✔
3569
  }
3570

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

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

3581
  while (numOfRows < rows) {
2,188,974✔
3582
    pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb);
2,187,923✔
3583
    if (pShow->pIter == NULL) break;
2,187,923✔
3584

3585
    if (pDb != NULL && pStb->dbUid != pDb->uid) {
1,907,691✔
3586
      sdbRelease(pSdb, pStb);
951,206✔
3587
      continue;
951,206✔
3588
    }
3589

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

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

3604
    SName name = {0};
956,485✔
3605

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

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

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

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

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

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

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

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

3644
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
954,419✔
3645
    if (pStb->commentLen > 0) {
954,419✔
3646
      char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
19,348✔
3647
      STR_TO_VARSTR(comment, pStb->comment);
19,348✔
3648
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, comment, false), pStb, &lino, _ERROR);
19,348✔
3649
    } else if (pStb->commentLen == 0) {
935,071✔
3650
      char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
127,573✔
3651
      STR_TO_VARSTR(comment, "");
127,573✔
3652
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, comment, false), pStb, &lino, _ERROR);
127,573✔
3653
    } else {
3654
      colDataSetNULL(pColInfo, numOfRows);
807,498✔
3655
    }
3656

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

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

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

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

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

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

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

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

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

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

3718
    numOfRows++;
954,419✔
3719
    sdbRelease(pSdb, pStb);
954,419✔
3720
  }
3721

3722
  if (pDb != NULL) {
281,283✔
3723
    mndReleaseDb(pMnode, pDb);
226,975✔
3724
  }
3725
  if (pOperUser != NULL) {
281,283✔
3726
    mndReleaseUser(pMnode, pOperUser);
281,283✔
3727
  }
3728

3729
  goto _OVER;
281,283✔
3730

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

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

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

3756
  STR_TO_VARSTR(dName, dbName);
1,837,622✔
3757
  STR_TO_VARSTR(typeName, "SYSTEM_TABLE");
1,837,622✔
3758

3759
  for (int32_t i = 0; i < size; ++i) {
62,477,570✔
3760
    const SSysTableMeta *pm = &pSysDbTableMeta[i];
60,639,948✔
3761
    //    if (pm->sysInfo) {
3762
    //      continue;
3763
    //    }
3764
    if (tbName[0] && strncmp(tbName, pm->name, TSDB_TABLE_NAME_LEN) != 0) {
60,639,948✔
3765
      continue;
×
3766
    }
3767

3768
    STR_TO_VARSTR(tName, pm->name);
60,639,422✔
3769

3770
    for (int32_t j = 0; j < pm->colNum; j++) {
606,255,356✔
3771
      // table name
3772
      SColumnInfoData *pColInfoData = taosArrayGet(p->pDataBlock, 0);
545,704,302✔
3773
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, tName, false), &lino, _OVER);
545,690,626✔
3774

3775
      // database name
3776
      pColInfoData = taosArrayGet(p->pDataBlock, 1);
545,684,314✔
3777
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, dName, false), &lino, _OVER);
545,675,898✔
3778

3779
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
545,659,066✔
3780
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, typeName, false), &lino, _OVER);
545,654,858✔
3781

3782
      // col name
3783
      char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
545,684,314✔
3784
      STR_TO_VARSTR(colName, pm->schema[j].name);
545,685,366✔
3785
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
545,715,348✔
3786
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, colName, false), &lino, _OVER);
545,645,916✔
3787

3788
      // col type
3789
      int8_t colType = pm->schema[j].type;
545,683,262✔
3790
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
545,676,950✔
3791
      char colTypeStr[VARSTR_HEADER_SIZE + 32];
545,673,794✔
3792
      int  colTypeLen =
3793
          snprintf(varDataVal(colTypeStr), sizeof(colTypeStr) - VARSTR_HEADER_SIZE, "%s", tDataTypes[colType].name);
545,673,794✔
3794
      if (colType == TSDB_DATA_TYPE_VARCHAR) {
545,714,822✔
3795
        colTypeLen +=
275,612,792✔
3796
            snprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d)",
275,612,792✔
3797
                     (int32_t)(pm->schema[j].bytes - VARSTR_HEADER_SIZE));
275,617,000✔
3798
      } else if (colType == TSDB_DATA_TYPE_NCHAR) {
270,097,822✔
3799
        colTypeLen +=
×
3800
            snprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d)",
×
3801
                     (int32_t)((pm->schema[j].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
×
3802
      }
3803
      varDataSetLen(colTypeStr, colTypeLen);
545,710,614✔
3804
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, (char *)colTypeStr, false), &lino, _OVER);
545,567,016✔
3805

3806
      // col length
3807
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
545,711,666✔
3808
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, (const char *)&pm->schema[j].bytes, false), &lino, _OVER);
545,683,788✔
3809

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

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

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

3833
  if (buildWhichDBs & BUILD_COL_FOR_INFO_DB) {
969,897✔
3834
    getInfosDbMeta(&pSysDbTableMeta, &size);
918,811✔
3835
    p->info.rows = buildDbColsInfoBlock(p, pSysDbTableMeta, size, TSDB_INFORMATION_SCHEMA_DB, tb);
918,811✔
3836
  }
3837

3838
  if (buildWhichDBs & BUILD_COL_FOR_PERF_DB) {
969,897✔
3839
    getPerfDbMeta(&pSysDbTableMeta, &size);
918,811✔
3840
    p->info.rows = buildDbColsInfoBlock(p, pSysDbTableMeta, size, TSDB_PERFORMANCE_SCHEMA_DB, tb);
918,811✔
3841
  }
3842

3843
  return p->info.rows;
969,897✔
3844
}
3845

3846
static int8_t determineBuildColForWhichDBs(const char *db) {
973,665✔
3847
  int8_t buildWhichDBs;
3848
  if (!db[0])
973,665✔
3849
    buildWhichDBs = BUILD_COL_FOR_ALL_DB;
918,654✔
3850
  else {
3851
    char *p = strchr(db, '.');
55,011✔
3852
    if (p && strcmp(p + 1, TSDB_INFORMATION_SCHEMA_DB) == 0) {
55,011✔
3853
      buildWhichDBs = BUILD_COL_FOR_INFO_DB;
157✔
3854
    } else if (p && strcmp(p + 1, TSDB_PERFORMANCE_SCHEMA_DB) == 0) {
54,854✔
3855
      buildWhichDBs = BUILD_COL_FOR_PERF_DB;
157✔
3856
    } else {
3857
      buildWhichDBs = BUILD_COL_FOR_USER_DB;
54,697✔
3858
    }
3859
  }
3860
  return buildWhichDBs;
973,665✔
3861
}
3862

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

3872
  buildWhichDBs = determineBuildColForWhichDBs(pShow->db);
973,665✔
3873

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

3880
  if (buildWhichDBs & BUILD_COL_FOR_USER_DB) {
973,665✔
3881
    SDbObj *pDb = NULL;
973,351✔
3882
    if (strlen(pShow->db) > 0) {
973,351✔
3883
      pDb = mndAcquireDb(pMnode, pShow->db);
54,697✔
3884
      if (pDb == NULL && TSDB_CODE_MND_DB_NOT_EXIST != terrno && pBlock->info.rows == 0) return terrno;
54,697✔
3885
    }
3886

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

3902
      if (pDb != NULL && pStb->dbUid != pDb->uid) {
1,998,862✔
3903
        sdbRelease(pSdb, pStb);
2,636✔
3904
        continue;
2,636✔
3905
      }
3906

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

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

3925
      varDataSetLen(stbName, strlen(&stbName[VARSTR_HEADER_SIZE]));
1,992,458✔
3926

3927
      mDebug("mndRetrieveStbCol get stable cols, stable name:%s, db:%s", pStb->name, pStb->db);
1,992,458✔
3928

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

3934
      for (int i = 0; i < pStb->numOfColumns; i++) {
34,473,003✔
3935
        int32_t          cols = 0;
32,480,545✔
3936
        SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
32,480,545✔
3937
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stbName, false), pStb, &lino, _OVER);
32,480,545✔
3938

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

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

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

3951
        // col type
3952
        int8_t colType = pStb->pColumns[i].type;
32,480,545✔
3953
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
32,480,545✔
3954
        char colTypeStr[VARSTR_HEADER_SIZE + 32];
32,480,545✔
3955
        int  colTypeLen =
3956
            snprintf(varDataVal(colTypeStr), sizeof(colTypeStr) - VARSTR_HEADER_SIZE, "%s", tDataTypes[colType].name);
32,480,545✔
3957
        if (colType == TSDB_DATA_TYPE_VARCHAR) {
32,480,545✔
3958
          colTypeLen +=
1,026,096✔
3959
              snprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE,
1,026,096✔
3960
                       "(%d)", (int32_t)(pStb->pColumns[i].bytes - VARSTR_HEADER_SIZE));
1,026,096✔
3961
        } else if (colType == TSDB_DATA_TYPE_NCHAR) {
31,454,449✔
3962
          colTypeLen +=
1,025,740✔
3963
              snprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE,
1,025,740✔
3964
                       "(%d)", (int32_t)((pStb->pColumns[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
1,025,740✔
3965
        } else if (IS_DECIMAL_TYPE(colType)) {
30,428,709✔
3966
          STypeMod typeMod = pStb->pExtSchemas[i].typeMod;
183,768✔
3967
          uint8_t prec = 0, scale = 0;
183,768✔
3968
          decimalFromTypeMod(typeMod, &prec, &scale);
183,768✔
3969
          colTypeLen += snprintf(varDataVal(colTypeStr) + colTypeLen,
183,768✔
3970
                                 sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d,%d)", prec, scale);
3971
        }
3972
        varDataSetLen(colTypeStr, colTypeLen);
32,480,545✔
3973
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (char *)colTypeStr, false), pStb, &lino, _OVER);
32,480,545✔
3974

3975
        // col length
3976
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
32,480,545✔
3977
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->pColumns[i].bytes, false), pStb,
32,480,545✔
3978
                            &lino, _OVER);
3979
        
3980
        // col precision, col scale, col nullable, col source
3981
        for (int32_t j = 6; j <= 9; ++j) {
162,400,621✔
3982
          pColInfo = taosArrayGet(pBlock->pDataBlock, j);
129,920,602✔
3983
          colDataSetNULL(pColInfo, numOfRows);
129,921,128✔
3984
        }
3985

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

3993
      sdbRelease(pSdb, pStb);
1,992,458✔
3994
    }
3995

3996
    if (pDb != NULL) {
973,351✔
3997
      mndReleaseDb(pMnode, pDb);
54,510✔
3998
    }
3999
  }
4000

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

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

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

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

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

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

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

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

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

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

4050
  return code;
4051

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4251
  void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
35,604✔
4252

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

4258
  *len = contLen;
35,604✔
4259
  return pHead;
35,604✔
4260
}
4261

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

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

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

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

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

4317
_OVER:
8,901✔
4318
  mndTransDrop(pTrans);
12,306✔
4319
  TAOS_RETURN(code);
12,306✔
4320
}
4321

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

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

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

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

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

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

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

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

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

4426
static int32_t mndProcessFetchTtlExpiredTbs(SRpcMsg *pRsp) {
13,112,237✔
4427
  int32_t                 code = -1;
13,112,237✔
4428
  SDecoder                decoder = {0};
13,112,237✔
4429
  SMnode                 *pMnode = pRsp->info.node;
13,112,237✔
4430
  SVFetchTtlExpiredTbsRsp rsp = {0};
13,112,237✔
4431
  SMndDropTbsWithTsmaCtx *pCtx = NULL;
13,112,237✔
4432
  if (pRsp->code != TSDB_CODE_SUCCESS) {
13,112,237✔
4433
    code = pRsp->code;
116,471✔
4434
    goto _end;
116,471✔
4435
  }
4436
  if (pRsp->contLen == 0) {
12,995,766✔
4437
    code = 0;
12,983,460✔
4438
    goto _end;
12,983,460✔
4439
  }
4440

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

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

4448
  code = mndDropTbForSingleVg(pMnode, pCtx, rsp.pExpiredTbs, rsp.vgId);
12,306✔
4449
  if (code) goto _end;
12,306✔
4450
  code = mndCreateDropTbsTxnPrepare(pRsp, pCtx);
12,306✔
4451
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
12,306✔
4452
_end:
13,111,192✔
4453
  if (pCtx) mndDestroyDropTbsWithTsmaCtx(pCtx);
13,112,237✔
4454
  tDecoderClear(&decoder);
13,112,237✔
4455
  tFreeFetchTtlExpiredTbsRsp(&rsp);
13,112,237✔
4456
  TAOS_RETURN(code);
13,112,237✔
4457
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc