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

taosdata / TDengine / #5015

03 Apr 2026 03:59PM UTC coverage: 72.289% (+0.03%) from 72.256%
#5015

push

travis-ci

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

4055 of 5985 new or added lines in 68 files covered. (67.75%)

13044 existing lines in 149 files now uncovered.

257390 of 356056 relevant lines covered (72.29%)

130247228.09 hits per line

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

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

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

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

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

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

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

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

111
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STB, mndRetrieveStb);
456,894✔
112
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_STB, mndCancelGetNextStb);
456,894✔
113

114
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_COL, mndRetrieveStbCol);
456,894✔
115
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_COL, mndCancelGetNextStb);
456,894✔
116

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

120
void mndCleanupStb(SMnode *pMnode) {}
456,833✔
121

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

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

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

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

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

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

181
  if (pStb->commentLen > 0) {
15,589,802✔
182
    SDB_SET_BINARY(pRaw, dataPos, pStb->comment, pStb->commentLen + 1, _OVER)
64,784✔
183
  }
184

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

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

193
  if (pStb->pCmpr != NULL) {
15,589,802✔
194
    for (int i = 0; i < pStb->numOfColumns; i++) {
946,334,877✔
195
      SColCmpr *p = &pStb->pCmpr[i];
930,745,075✔
196
      SDB_SET_INT16(pRaw, dataPos, p->id, _OVER)
930,745,075✔
197
      SDB_SET_INT32(pRaw, dataPos, p->alg, _OVER)
930,745,075✔
198
    }
199
  }
200
  SDB_SET_INT64(pRaw, dataPos, pStb->keep, _OVER)
15,589,802✔
201

202
  if (hasTypeMod) {
15,589,802✔
203
    for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
586,680,381✔
204
      SDB_SET_INT32(pRaw, dataPos, pStb->pExtSchemas[i].typeMod, _OVER);
581,594,779✔
205
    }
206
  }
207

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

216
  terrno = 0;
15,589,802✔
217

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

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

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

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

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

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

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

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

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

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

291
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
149,563,097✔
292
    SSchema *pSchema = &pStb->pTags[i];
134,828,979✔
293
    SDB_GET_INT8(pRaw, dataPos, &pSchema->type, _OVER)
134,828,979✔
294
    SDB_GET_INT8(pRaw, dataPos, &pSchema->flags, _OVER)
134,828,979✔
295
    SDB_GET_INT16(pRaw, dataPos, &pSchema->colId, _OVER)
134,828,979✔
296
    SDB_GET_INT32(pRaw, dataPos, &pSchema->bytes, _OVER)
134,828,979✔
297
    SDB_GET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
134,828,979✔
298
  }
299

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

306
  if (pStb->commentLen > 0) {
14,734,118✔
307
    pStb->comment = taosMemoryCalloc(pStb->commentLen + 1, 1);
62,499✔
308
    if (pStb->comment == NULL) goto _OVER;
62,499✔
309
    SDB_GET_BINARY(pRaw, dataPos, pStb->comment, pStb->commentLen + 1, _OVER)
62,499✔
310
  }
311

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

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

324
  pStb->pCmpr = taosMemoryCalloc(pStb->numOfColumns, sizeof(SColCmpr));
14,734,118✔
325
  if (sver < STB_VER_SUPPORT_COMP) {
14,734,118✔
326
    // compatible with old data, setup default compress value
327
    // impl later
UNCOV
328
    for (int i = 0; i < pStb->numOfColumns; i++) {
×
UNCOV
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,530,788,340✔
336
      SColCmpr *pCmpr = &pStb->pCmpr[i];
1,516,054,222✔
337
      SDB_GET_INT16(pRaw, dataPos, &pCmpr->id, _OVER)
1,516,054,222✔
338
      SDB_GET_INT32(pRaw, dataPos, (int32_t *)&pCmpr->alg, _OVER)  // compatiable
1,516,054,222✔
339
    }
340
  }
341
  SDB_GET_INT64(pRaw, dataPos, &pStb->keep, _OVER)
14,734,118✔
342

343
  // type mod
344
  if (hasExtSchemas) {
14,734,118✔
345
    pStb->pExtSchemas = taosMemoryCalloc(pStb->numOfColumns, sizeof(SExtSchema));
6,389,470✔
346
    if (!pStb->pExtSchemas) goto _OVER;
6,389,470✔
347
    for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
1,256,516,082✔
348
      SSchema *pSchema = &pStb->pColumns[i];
1,250,126,612✔
349
      SDB_GET_INT32(pRaw, dataPos, &pStb->pExtSchemas[i].typeMod, _OVER)
1,250,126,612✔
350
    }
351
  }
352

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

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

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

372
  SDB_GET_RESERVE(pRaw, dataPos, STB_RESERVE_SIZE, _OVER)
14,734,118✔
373

374
  terrno = 0;
14,734,118✔
375

376
_OVER:
14,734,118✔
377
  if (terrno != 0) {
14,734,118✔
UNCOV
378
    mError("stb:%s, failed to decode from raw:%p since %s", pStb == NULL ? "null" : pStb->name, pRaw, terrstr());
×
UNCOV
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);
×
UNCOV
387
    return NULL;
×
388
  }
389

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

544
  return mndAcquireDb(pMnode, db);
8,193,697✔
545
}
546

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

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

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

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

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

593
  req.colCmpr.pColCmpr = taosMemoryCalloc(pCmpr->nCols, sizeof(SColCmpr));
10,801,757✔
594
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
908,990,572✔
595
    SColCmpr *p = &pCmpr->pColCmpr[i];
898,188,815✔
596
    p->alg = pStb->pCmpr[i].alg;
898,188,815✔
597
    p->id = pStb->pCmpr[i].id;
898,188,815✔
598
  }
599

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

608
  contLen += sizeof(SMsgHead);
10,801,757✔
609

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

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

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

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

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

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

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

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

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

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

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

680
  *pContLen = contLen;
5,245,765✔
681
  return pHead;
5,245,765✔
682
}
683

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

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

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

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

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

713
  for (int32_t i = 0; i < pCreate->numOfColumns; ++i) {
156,340,808✔
714
    SFieldWithOptions *pField1 = taosArrayGet(pCreate->pColumns, i);
154,347,409✔
715
    if (pField1->type >= TSDB_DATA_TYPE_MAX) {
154,347,409✔
UNCOV
716
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
UNCOV
717
      TAOS_RETURN(code);
×
718
    }
719
    if (pField1->bytes <= 0) {
154,347,409✔
UNCOV
720
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
UNCOV
721
      TAOS_RETURN(code);
×
722
    }
723
    if (pField1->name[0] == 0) {
154,347,409✔
UNCOV
724
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
UNCOV
725
      TAOS_RETURN(code);
×
726
    }
727
  }
728

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

745
  TAOS_RETURN(code);
1,993,399✔
746
}
747

UNCOV
748
static int32_t mndSetCreateStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
×
UNCOV
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) {
×
UNCOV
757
    sdbFreeRaw(pRedoRaw);
×
758
    TAOS_RETURN(code);
×
759
  }
760
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_CREATING));
×
761

762
  TAOS_RETURN(code);
×
763
}
764

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

780
  TAOS_RETURN(code);
1,949,973✔
781
}
782

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

790
  while (1) {
8,493,840✔
791
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
10,442,123✔
792
    if (pIter == NULL) break;
10,442,123✔
793
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
8,493,840✔
794
      sdbRelease(pSdb, pVgroup);
4,177,342✔
795
      continue;
4,177,342✔
796
    }
797

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

825
  TAOS_RETURN(code);
1,948,283✔
826
}
827

UNCOV
828
int32_t mndSetForceDropCreateStbRedoActions(SMnode *pMnode, STrans *pTrans, SVgObj *pVgroup, SStbObj *pStb) {
×
UNCOV
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);
×
UNCOV
834
  if (pReq == NULL) {
×
835
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
836
    if (terrno != 0) code = terrno;
×
837
    TAOS_RETURN(code);
×
838
  }
839

UNCOV
840
  STransAction action = {0};
×
UNCOV
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

UNCOV
854
  TAOS_RETURN(code);
×
855
}
856

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

863
  while (1) {
8,493,840✔
864
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
10,442,123✔
865
    if (pIter == NULL) break;
10,442,123✔
866
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
8,493,840✔
867
      sdbRelease(pSdb, pVgroup);
4,177,342✔
868
      continue;
4,177,342✔
869
    }
870

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

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

896
  TAOS_RETURN(code);
1,948,283✔
897
}
898

UNCOV
899
static SSchema *mndFindStbColumns(const SStbObj *pStb, const char *colName) {
×
UNCOV
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
  }
UNCOV
906
  return NULL;
×
907
}
908

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

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

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

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

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

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

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

993
  for (int32_t i = 0; i < pDst->numOfTags; ++i) {
10,037,063✔
994
    SField  *pField = taosArrayGet(pCreate->pTags, i);
8,083,338✔
995
    SSchema *pSchema = &pDst->pTags[i];
8,083,338✔
996
    pSchema->type = pField->type;
8,083,338✔
997
    pSchema->bytes = pField->bytes;
8,083,338✔
998
    if (i == 0) {
8,083,338✔
999
      SSCHMEA_SET_IDX_ON(pSchema);
1,953,725✔
1000
    }
1001
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
8,083,338✔
1002
    pSchema->colId = pDst->nextColId;
8,083,338✔
1003
    pDst->nextColId++;
8,083,338✔
1004
  }
1005
  // set col compress
1006
  pDst->pCmpr = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SCmprObj));
1,953,725✔
1007
  for (int32_t i = 0; i < pDst->numOfColumns; i++) {
119,691,804✔
1008
    SFieldWithOptions *pField = taosArrayGet(pCreate->pColumns, i);
117,738,079✔
1009
    SSchema           *pSchema = &pDst->pColumns[i];
117,738,079✔
1010

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

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

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

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

1043
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_DB_INSIDE, pReq, "create-stb");
1,885,869✔
1044
  if (pTrans == NULL) {
1,885,869✔
UNCOV
1045
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
UNCOV
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,885,869✔
1051
  TAOS_CHECK_GOTO(mndBuildStbFromReq(pMnode, &stbObj, pCreate, pDb), NULL, _OVER);
1,885,869✔
1052
  memcpy(stbObj.createUser, pOperUser->name, TSDB_USER_LEN);
1,884,759✔
1053
  stbObj.ownerId = pOperUser->uid;
1,884,759✔
1054

1055

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

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

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

1082
  TAOS_CHECK_GOTO(mndAddStbToTrans(pMnode, pTrans, pDb, &stbObj), NULL, _OVER);
1,884,759✔
1083
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
1,879,317✔
1084
  code = 0;
1,879,227✔
1085

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

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

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

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

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

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

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

1199
  int32_t contLen;
52✔
1200

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

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

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

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

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

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

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

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

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

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

1273
  code = 0;
52✔
1274

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

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

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

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

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

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

1302
  return code;
208✔
1303
}
1304

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

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

1324
  mDebug("start to process ttl timer");
3,221,501✔
1325

1326
  while (1) {
12,309,303✔
1327
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
15,530,804✔
1328
    if (pIter == NULL) break;
15,530,804✔
1329

1330
    if (pVgroup->mountVgId) {
12,309,303✔
1331
      sdbRelease(pSdb, pVgroup);
1,116✔
1332
      continue;
1,116✔
1333
    }
1334

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

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

1361
  return 0;
3,221,501✔
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,688,582✔
1420
  for (int32_t tag = 0; tag < pStb->numOfTags; tag++) {
29,112,867✔
1421
    if (strcmp(pStb->pTags[tag].name, tagName) == 0) {
26,356,845✔
1422
      return tag;
932,560✔
1423
    }
1424
  }
1425

1426
  return -1;
2,756,022✔
1427
}
1428

1429
static int32_t mndFindSuperTableColumnIndex(const SStbObj *pStb, const char *colName) {
5,586,280✔
1430
  for (int32_t col = 0; col < pStb->numOfColumns; col++) {
317,694,442✔
1431
    if (strcmp(pStb->pColumns[col].name, colName) == 0) {
314,866,799✔
1432
      return col;
2,758,637✔
1433
    }
1434
  }
1435

1436
  return -1;
2,827,643✔
1437
}
1438

1439
static bool mndValidateSchema(SSchema *pSchemas, int32_t nSchema, SArray *pFields, int32_t maxLen) {
2,961,630✔
1440
  int32_t rowLen = 0;
2,961,630✔
1441
  for (int32_t i = 0; i < nSchema; ++i) {
202,099,689✔
1442
    rowLen += (pSchemas + i)->bytes;
199,138,059✔
1443
  }
1444

1445
  int32_t nField = taosArrayGetSize(pFields);
2,961,630✔
1446
  for (int32_t i = 0; i < nField; ++i) {
5,923,260✔
1447
    rowLen += ((SField *)TARRAY_GET_ELEM(pFields, i))->bytes;
2,961,630✔
1448
  }
1449

1450
  return rowLen <= maxLen;
2,961,630✔
1451
}
1452

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

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

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

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

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

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

1552
  for (int32_t i = 0; i < pDst->numOfTags && taosArrayGetSize(alterReq.pFields) == 0; ++i) {
145,208✔
1553
    SSchema *pSchema = &pDst->pTags[i];
113,985✔
1554
    int32_t cIndex = mndFindSuperTableTagIndex(pStb, pSchema->name);
113,985✔
1555
    if (cIndex >= 0 && pSchema->bytes == pStb->pTags[cIndex].bytes) {
113,985✔
1556
      continue;
99,006✔
1557
    }
1558
    if (cIndex < 0) {
14,979✔
1559
      alterReq.alterType = TSDB_ALTER_TABLE_ADD_TAG;
9,893✔
1560
    } else if (pSchema->bytes > pStb->pTags[cIndex].bytes){
5,086✔
1561
      alterReq.alterType = TSDB_ALTER_TABLE_UPDATE_TAG_BYTES;
5,086✔
1562
    }
1563
    SField *pAlterField = taosArrayReserve(alterReq.pFields, 1);
14,979✔
1564
    pAlterField->type = pSchema->type;
14,979✔
1565
    pAlterField->bytes = pSchema->bytes;
14,979✔
1566
    tstrncpy(pAlterField->name, pSchema->name, TSDB_COL_NAME_LEN);
14,979✔
1567
    mDebug("alter tag name:%s, type:%d, bytes:%d", pAlterField->name, pAlterField->type, pAlterField->bytes);
14,979✔
1568
  }
1569
  alterReq.numOfFields = taosArrayGetSize(alterReq.pFields);
31,223✔
1570
  if (alterReq.numOfFields == 0) {
31,223✔
UNCOV
1571
    mError("no valid alter field found");
×
UNCOV
1572
    goto END;
×
1573
  }
1574

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

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

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

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

1619
  pStb = mndAcquireStb(pMnode, createReq.name);
1,924,433✔
1620
  if (pStb != NULL) {
1,924,433✔
1621
    if (createReq.igExists) {
38,369✔
1622
      if (createReq.source == TD_REQ_FROM_APP) {
36,932✔
1623
        mInfo("stb:%s, already exist, ignore exist is set", createReq.name);
4,776✔
1624
        code = 0;
4,776✔
1625
        goto _OVER;
4,776✔
1626
      } else if (pStb->uid != createReq.suid) {
32,156✔
UNCOV
1627
        mInfo("stb:%s, alter table does not need to be done, because table is deleted", createReq.name);
×
UNCOV
1628
        code = 0;
×
1629
        goto _OVER;
×
1630
      } else if (createReq.tagVer > 0 || createReq.colVer > 0) {
63,379✔
1631
        int32_t tagDelta = createReq.tagVer - pStb->tagVer;
32,156✔
1632
        int32_t colDelta = createReq.colVer - pStb->colVer;
32,156✔
1633
        mInfo("stb:%s, already exist while create, input tagVer:%d colVer:%d, exist tagVer:%d colVer:%d",
32,156✔
1634
              createReq.name, createReq.tagVer, createReq.colVer, pStb->tagVer, pStb->colVer);
1635
        if (tagDelta <= 0 && colDelta <= 0) {
32,156✔
1636
          mInfo("stb:%s, schema version is not incremented and nothing needs to be done", createReq.name);
933✔
1637
          code = 0;
933✔
1638
          goto _OVER;
933✔
1639
        } else if ((tagDelta == 1 && colDelta == 0) || (tagDelta == 0 && colDelta == 1) ||
31,223✔
UNCOV
1640
                   (pStb->colVer == 1 && createReq.colVer > 1) || (pStb->tagVer == 1 && createReq.tagVer > 1)) {
×
1641
          isAlter = true;
31,223✔
1642
          mInfo("stb:%s, schema version is only increased by 1 number, do alter operation", createReq.name);
31,223✔
1643
        } else {
UNCOV
1644
          mError("stb:%s, schema version increase more than 1 number, error is returned", createReq.name);
×
UNCOV
1645
          code = TSDB_CODE_MND_INVALID_SCHEMA_VER;
×
1646
          goto _OVER;
×
1647
        }
1648
      } else {
UNCOV
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;
×
UNCOV
1652
        goto _OVER;
×
1653
      }
1654
    } else {
1655
      code = TSDB_CODE_MND_STB_ALREADY_EXIST;
1,437✔
1656
      goto _OVER;
1,437✔
1657
    }
1658
  } else if (terrno != TSDB_CODE_MND_STB_NOT_EXIST) {
1,886,064✔
UNCOV
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,886,064✔
1661
             (createReq.tagVer != 1 || createReq.colVer != 1)) {
4,697✔
UNCOV
1662
    mInfo("stb:%s, alter table does not need to be done, because table is deleted", createReq.name);
×
UNCOV
1663
    code = 0;
×
1664
    goto _OVER;
×
1665
  }
1666

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

1674
  for (int32_t i = 0; i < createReq.numOfColumns; ++i) {
155,928,018✔
1675
    SFieldWithOptions *pField = taosArrayGet(createReq.pColumns, i);
154,010,731✔
1676
    if ((code = taosHashPut(pHash, pField->name, strlen(pField->name), NULL, 0)) != 0) {
154,010,731✔
UNCOV
1677
      if (code == TSDB_CODE_DUP_KEY) {
×
UNCOV
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,088,649✔
1685
    SField *pField = taosArrayGet(createReq.pTags, i);
8,171,557✔
1686
    if ((code = taosHashPut(pHash, pField->name, strlen(pField->name), NULL, 0)) != 0) {
8,171,557✔
1687
      if (code == TSDB_CODE_DUP_KEY) {
195✔
1688
        code = TSDB_CODE_TSC_DUP_COL_NAMES;
195✔
1689
      }
1690
      goto _OVER;
195✔
1691
    }
1692
  }
1693

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

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

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

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

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

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

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

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

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

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

1761
    int64_t tse = taosGetTimestampMs();
1,917,092✔
1762
    double  duration = (double)(tse - tss);
1,917,092✔
1763
    duration = duration / 1000;
1,917,092✔
1764
    if (createReq.sql == NULL && createReq.sqlLen == 0) {
1,918,847✔
1765
      char detail[1000] = {0};
382,351✔
1766

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

1769
      auditRecord(pReq, pMnode->clusterId, "createStb", name.dbname, name.tname, detail, strlen(detail), duration, 0);
382,351✔
1770
    } else {
1771
      auditRecord(pReq, pMnode->clusterId, "createStb", name.dbname, name.tname, createReq.sql, createReq.sqlLen,
1,534,741✔
1772
                  duration, 0);
1773
    }
1774
  }
1775
_OVER:
1,920,582✔
1776
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
1,924,433✔
1777
    mError("stb:%s, failed to create since %s", createReq.name, tstrerror(code));
8,274✔
1778
  }
1779

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

1785
  if (pHash != NULL) {
1,924,433✔
1786
    taosHashCleanup(pHash);
1,917,287✔
1787
  }
1788

1789
  TAOS_RETURN(code);
1,924,433✔
1790
}
1791

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

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

UNCOV
1804
  for (int32_t i = 0; i < pAlter->numOfFields; ++i) {
×
UNCOV
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

UNCOV
1812
  TAOS_RETURN(code);
×
1813
}
1814

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

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

1834
  TAOS_RETURN(0);
5,477,836✔
1835
}
1836

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

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

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

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

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

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

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

1884
  if (!mndValidateSchema(pOld->pTags, pOld->numOfTags, pFields, TSDB_MAX_TAGS_LEN)) {
293,483✔
1885
    code = TSDB_CODE_PAR_INVALID_TAGS_LENGTH;
21,408✔
1886
    TAOS_RETURN(code);
21,408✔
1887
  }
1888

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

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

1899
  for (int32_t i = 0; i < ntags; i++) {
476,433✔
1900
    SField *pField = taosArrayGet(pFields, i);
270,965✔
1901
    if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
270,965✔
1902
      code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
2,226✔
1903
      TAOS_RETURN(code);
2,226✔
1904
    }
1905

1906
    if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
268,739✔
1907
      code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
63,271✔
1908
      TAOS_RETURN(code);
63,271✔
1909
    }
1910

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

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

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

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

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

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

UNCOV
1949
    SNode *pAst = NULL;
×
UNCOV
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);
×
UNCOV
1955
      TAOS_RETURN(code);
×
1956
    }
1957

UNCOV
1958
    SNodeList *pNodeList = NULL;
×
UNCOV
1959
    if ((code = nodesCollectColumns((SSelectStmt *)pAst, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pNodeList)) !=
×
1960
        0) {
1961
      sdbCancelFetch(pSdb, pIter);
×
UNCOV
1962
      TAOS_RETURN(code);
×
1963
    }
1964
    SNode *pNode = NULL;
×
UNCOV
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)) {
×
UNCOV
1970
        mInfo("tsma:%s, check colId:%d passed", pSma->name, pCol->colId);
×
1971
        goto NEXT;
×
1972
      }
1973
      if ((pCol->colId) > 0 && (pCol->colId == colId)) {
×
UNCOV
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

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

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

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

2004
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
108,826✔
2005

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

2009
  pNew->tagVer++;
108,826✔
2010

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

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

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

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

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

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

2040
  if (mndFindSuperTableTagIndex(pOld, newTagName) >= 0) {
124,135✔
2041
    code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
6,441✔
2042
    TAOS_RETURN(code);
6,441✔
2043
  }
2044

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

2050
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
117,499✔
2051

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

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

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

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

2071
  uint32_t nLen = 0;
332,529✔
2072
  for (int32_t i = 0; i < pOld->numOfTags; ++i) {
13,288,812✔
2073
    nLen += (pOld->pTags[i].colId == colId) ? pField->bytes : pOld->pTags[i].bytes;
12,956,283✔
2074
  }
2075

2076
  if (nLen > TSDB_MAX_TAGS_LEN) {
332,529✔
2077
    code = TSDB_CODE_PAR_INVALID_TAGS_LENGTH;
193,341✔
2078
    TAOS_RETURN(code);
193,341✔
2079
  }
2080

2081
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
139,188✔
2082

2083
  SSchema *pTag = pNew->pTags + tag;
139,188✔
2084

2085
  if (!(pTag->type == TSDB_DATA_TYPE_BINARY || pTag->type == TSDB_DATA_TYPE_VARBINARY ||
139,188✔
2086
        pTag->type == TSDB_DATA_TYPE_NCHAR || pTag->type == TSDB_DATA_TYPE_GEOMETRY)) {
133,441✔
2087
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
195✔
2088
    TAOS_RETURN(code);
195✔
2089
  }
2090

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

2096
  pTag->bytes = pField->bytes;
91,299✔
2097
  pNew->tagVer++;
91,299✔
2098

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

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

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

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

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

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

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

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

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

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

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

2168
  pNew->numOfColumns = pNew->numOfColumns + ncols;
2,668,147✔
2169

2170
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
2,668,147✔
2171

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

2177
  for (int32_t i = 0; i < ncols; i++) {
5,075,960✔
2178
    if (withCompress) {
2,667,037✔
2179
      SFieldWithOptions *pField = taosArrayGet(pReq->pFields, i);
256,982✔
2180
      if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
256,982✔
UNCOV
2181
        code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
×
UNCOV
2182
        TAOS_RETURN(code);
×
2183
      }
2184

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2304
  uint32_t nLen = 0;
503,353✔
2305
  int32_t  maxBytesPerRow = pOld->virtualStb ? TSDB_MAX_BYTES_PER_ROW_VIRTUAL : TSDB_MAX_BYTES_PER_ROW;
503,353✔
2306
  for (int32_t i = 0; i < pOld->numOfColumns; ++i) {
38,793,272✔
2307
    nLen += (pOld->pColumns[i].colId == colId) ? pField->bytes : pOld->pColumns[i].bytes;
38,289,919✔
2308
  }
2309

2310
  if (nLen > maxBytesPerRow) {
503,353✔
2311
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
18,258✔
2312
    TAOS_RETURN(code);
18,258✔
2313
  }
2314

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

2317
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
485,095✔
2318

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

2326
  if (pField->bytes <= pCol->bytes) {
484,900✔
2327
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
167,445✔
2328
    TAOS_RETURN(code);
167,445✔
2329
  }
2330

2331
  pCol->bytes = pField->bytes;
317,455✔
2332
  pNew->colVer++;
317,455✔
2333

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

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

2352
  TAOS_RETURN(code);
4,696,336✔
2353
}
2354

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

2369
  TAOS_RETURN(code);
4,696,336✔
2370
}
2371

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

2380
  while (1) {
12,012,394✔
2381
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
16,708,730✔
2382
    if (pIter == NULL) break;
16,708,730✔
2383
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
12,012,394✔
2384
      sdbRelease(pSdb, pVgroup);
5,545,600✔
2385
      continue;
5,545,600✔
2386
    }
2387

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

2410
  TAOS_RETURN(code);
4,696,336✔
2411
}
2412

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

2421
  while (1) {
×
UNCOV
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

UNCOV
2429
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, alterOriData, alterOriDataLen);
×
UNCOV
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};
×
UNCOV
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

UNCOV
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,369,318✔
2455
  int32_t code = 0;
22,369,318✔
2456
  taosRLockLatch(&pStb->lock);
22,369,318✔
2457

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

2490
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
622,608,356✔
2491
    SSchema *pSchema = &pRsp->pSchemas[i];
600,239,809✔
2492
    SSchema *pSrcSchema = &pStb->pColumns[i];
600,239,809✔
2493
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
600,239,038✔
2494
    pSchema->type = pSrcSchema->type;
600,239,814✔
2495
    pSchema->flags = pSrcSchema->flags;
600,238,655✔
2496
    pSchema->colId = pSrcSchema->colId;
600,238,655✔
2497
    pSchema->bytes = pSrcSchema->bytes;
600,238,655✔
2498
  }
2499
  
2500
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
104,801,064✔
2501
    SSchema *pSchema = &pRsp->pSchemas[i + pStb->numOfColumns];
82,432,134✔
2502
    SSchema *pSrcSchema = &pStb->pTags[i];
82,431,746✔
2503
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
82,432,517✔
2504
    pSchema->type = pSrcSchema->type;
82,432,517✔
2505
    pSchema->flags = pSrcSchema->flags;
82,432,537✔
2506
    pSchema->colId = pSrcSchema->colId;
82,431,766✔
2507
    pSchema->bytes = pSrcSchema->bytes;
82,432,517✔
2508
  }
2509

2510
  if (refByStm) {
22,368,930✔
2511
    mndStreamUpdateTagsRefFlag(pMnode, pStb->uid, &pRsp->pSchemas[pStb->numOfColumns], pStb->numOfTags);
15,788,931✔
2512
  }
2513

2514
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
622,606,849✔
2515
    SColCmpr   *pCmpr = &pStb->pCmpr[i];
600,237,914✔
2516
    SSchemaExt *pSchEx = &pRsp->pSchemaExt[i];
600,236,750✔
2517
    pSchEx->colId = pCmpr->id;
600,237,914✔
2518
    pSchEx->compress = pCmpr->alg;
600,238,690✔
2519
    if (pStb->pExtSchemas) {
600,237,919✔
2520
      pSchEx->typeMod = pStb->pExtSchemas[i].typeMod;
299,096,602✔
2521
    }
2522
  }
2523

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

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

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

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

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

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

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

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

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

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

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

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

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

2617
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
8,136,788✔
2618
  if (pStb == NULL) {
8,136,788✔
2619
    mndReleaseDb(pMnode, pDb);
2,090✔
2620
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
2,090✔
2621
    TAOS_RETURN(code);
2,090✔
2622
  }
2623

2624
  taosRLockLatch(&pStb->lock);
8,134,698✔
2625

2626
  if (pStbVer->sversion != pStb->colVer || pStbVer->tversion != pStb->tagVer) {
8,134,698✔
2627
    *schema = true;
21,685✔
2628
  } else {
2629
    *schema = false;
8,113,013✔
2630
  }
2631

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

2638
  taosRUnLockLatch(&pStb->lock);
8,134,698✔
2639

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

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

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

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

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

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

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

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

2687
  code = mndBuildStbCfgImp(pDb, pStb, tbName, pRsp);
26,223✔
2688

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

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

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

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

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

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

2730
  tFreeSMAlterStbRsp(&alterRsp);
4,640,183✔
2731

2732
  if (code < 0) TAOS_RETURN(code);
4,640,183✔
2733

2734
  *pCont = cont;
4,640,183✔
2735
  *pLen = contLen;
4,640,183✔
2736

2737
  TAOS_RETURN(code);
4,640,183✔
2738
}
2739

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

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

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

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

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

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

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

2790
  tFreeSMCreateStbRsp(&stbRsp);
1,918,131✔
2791

2792
  *pCont = cont;
1,918,131✔
2793
  *pLen = contLen;
1,918,131✔
2794

2795
  code = 0;
1,918,131✔
2796

2797
_OVER:
1,919,675✔
2798
  if (pObj) {
1,919,675✔
2799
    mndReleaseStb(pMnode, pObj);
1,918,131✔
2800
  }
2801

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

2806
  TAOS_RETURN(code);
1,919,675✔
2807
}
2808

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

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

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

2835
  code = 0;
4,470,011✔
2836

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

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

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

2855
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
226,325✔
2856

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

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

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

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

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

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

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

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

2904
    TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
117,499✔
2905
    TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
117,499✔
2906
  }
2907
  code = 0;
226,325✔
2908

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

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

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

2977
  if (code != 0) goto _OVER;
5,709,315✔
2978
  if (updateTagIndex == false) {
4,909,298✔
2979
    code = mndAlterStbImp(pMnode, pReq, pDb, &stbObj, needRsp, pReq->pCont, pReq->contLen);
4,682,973✔
2980
  } else {
2981
    code = mndAlterStbAndUpdateTagIdxImp(pMnode, pReq, pDb, &stbObj, needRsp, pReq->pCont, pReq->contLen, pAlter);
226,325✔
2982
  }
2983

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

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

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

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

3012
  pDb = mndAcquireDbByStb(pMnode, alterReq.name);
5,725,083✔
3013
  if (pDb == NULL) {
5,725,083✔
3014
    code = TSDB_CODE_MND_DB_NOT_EXIST;
390✔
3015
    goto _OVER;
390✔
3016
  }
3017
  if (pDb->cfg.isMount) {
5,724,693✔
3018
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
270✔
3019
    goto _OVER;
270✔
3020
  }
3021

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

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

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

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

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

3062
  TAOS_RETURN(code);
5,725,083✔
3063
}
3064

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

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

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

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

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

3105
  while (1) {
1,241,464✔
3106
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
1,708,135✔
3107
    if (pIter == NULL) break;
1,708,135✔
3108
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
1,241,464✔
3109
      sdbRelease(pSdb, pVgroup);
312,197✔
3110
      continue;
312,197✔
3111
    }
3112

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3304
  if (0 == strcmp(infoReq.dbFName, TSDB_INFORMATION_SCHEMA_DB)) {
18,592,614✔
3305
    mInfo("information_schema table:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
1,918,881✔
3306
    TAOS_CHECK_GOTO(mndBuildInsTableSchema(pMnode, infoReq.dbFName, infoReq.tbName, sysinfo, &metaRsp), NULL, _OVER);
1,918,881✔
3307
  } else if (0 == strcmp(infoReq.dbFName, TSDB_PERFORMANCE_SCHEMA_DB)) {
16,673,733✔
3308
    mInfo("performance_schema table:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
143,341✔
3309
    TAOS_CHECK_GOTO(mndBuildPerfsTableSchema(pMnode, infoReq.dbFName, infoReq.tbName, &metaRsp), NULL, _OVER);
143,341✔
3310
  } else {
3311
    mInfo("stb:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
16,530,392✔
3312
    TAOS_CHECK_GOTO(mndBuildStbSchema(pMnode, infoReq.dbFName, infoReq.tbName, &metaRsp, true), NULL, _OVER);
16,530,392✔
3313
  }
3314

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

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

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

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

3337
_OVER:
18,592,419✔
3338
  if (code != 0) {
18,592,614✔
3339
    mError("stb:%s.%s, failed to retrieve meta since %s", infoReq.dbFName, infoReq.tbName, tstrerror(code));
913,776✔
3340
  }
3341

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

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

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

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

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

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

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

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

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

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

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

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

3417
  for (int32_t i = 0; i < numOfStbs; ++i) {
13,968,955✔
3418
    SSTableVersion *pStbVersion = &pStbVersions[i];
8,171,747✔
3419
    pStbVersion->suid = be64toh(pStbVersion->suid);
8,171,747✔
3420
    pStbVersion->sversion = ntohl(pStbVersion->sversion);
8,171,747✔
3421
    pStbVersion->tversion = ntohl(pStbVersion->tversion);
8,171,747✔
3422
    pStbVersion->smaVer = ntohl(pStbVersion->smaVer);
8,171,747✔
3423

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

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

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

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

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

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

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

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

3498
  rspLen = tSerializeSSTbHbRsp(pRsp, rspLen, &hbRsp);
5,797,208✔
3499
  tFreeSSTbHbRsp(&hbRsp);
5,797,208✔
3500
  if (rspLen < 0) return rspLen;
5,797,208✔
3501
  *ppRsp = pRsp;
5,797,208✔
3502
  *pRspLen = rspLen;
5,797,208✔
3503
  TAOS_RETURN(code);
5,797,208✔
3504
}
3505

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

3515
  int32_t numOfStbs = 0;
1,986,058✔
3516
  void   *pIter = NULL;
1,986,058✔
3517
  while (1) {
31,132,563✔
3518
    SStbObj *pStb = NULL;
33,118,621✔
3519
    pIter = sdbFetch(pSdb, SDB_STB, pIter, (void **)&pStb);
33,118,621✔
3520
    if (pIter == NULL) break;
33,118,621✔
3521

3522
    if (pStb->dbUid == pDb->uid) {
31,132,563✔
3523
      numOfStbs++;
20,963,636✔
3524
    }
3525

3526
    sdbRelease(pSdb, pStb);
31,132,563✔
3527
  }
3528

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

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

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

3540
  return 0;
×
3541
}
3542

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

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

3549
  return 0;
×
3550
}
3551

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

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

3558
  return 0;
31,713✔
3559
}
3560

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

3569
  if (num == 2) {
2,859,046✔
3570
    tstrncpy(dst, stbFullName + pos + 1, dstSize);
2,858,527✔
3571
  }
3572
}
2,859,046✔
3573

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

3587
  SDbObj *pDb = NULL;
277,085✔
3588
  if (strlen(pShow->db) > 0) {
277,085✔
3589
    pDb = mndAcquireDb(pMnode, pShow->db);
224,426✔
3590
    if (pDb == NULL) return terrno;
224,426✔
3591
  }
3592

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

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

3603
  while (numOfRows < rows) {
2,143,025✔
3604
    pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb);
2,141,995✔
3605
    if (pShow->pIter == NULL) break;
2,141,995✔
3606

3607
    if (pDb != NULL && pStb->dbUid != pDb->uid) {
1,866,928✔
3608
      sdbRelease(pSdb, pStb);
932,378✔
3609
      continue;
932,378✔
3610
    }
3611

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

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

3626
    SName name = {0};
934,550✔
3627

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

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

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

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

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

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

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

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

3666
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
932,547✔
3667
    if (pStb->commentLen > 0) {
932,547✔
3668
      char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
19,057✔
3669
      STR_TO_VARSTR(comment, pStb->comment);
19,057✔
3670
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, comment, false), pStb, &lino, _ERROR);
19,057✔
3671
    } else if (pStb->commentLen == 0) {
913,490✔
3672
      char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
126,565✔
3673
      STR_TO_VARSTR(comment, "");
126,565✔
3674
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, comment, false), pStb, &lino, _ERROR);
126,565✔
3675
    } else {
3676
      colDataSetNULL(pColInfo, numOfRows);
786,925✔
3677
    }
3678

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

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

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

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

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

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

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

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

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

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

3740
    numOfRows++;
932,547✔
3741
    sdbRelease(pSdb, pStb);
932,547✔
3742
  }
3743

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

3751
  goto _OVER;
276,097✔
3752

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

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

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

3778
  STR_TO_VARSTR(dName, dbName);
1,811,476✔
3779
  STR_TO_VARSTR(typeName, "SYSTEM_TABLE");
1,811,476✔
3780

3781
  for (int32_t i = 0; i < size; ++i) {
60,683,927✔
3782
    const SSysTableMeta *pm = &pSysDbTableMeta[i];
58,870,894✔
3783
    //    if (pm->sysInfo) {
3784
    //      continue;
3785
    //    }
3786
    if (tbName[0] && strncmp(tbName, pm->name, TSDB_TABLE_NAME_LEN) != 0) {
58,871,413✔
UNCOV
3787
      continue;
×
3788
    }
3789

3790
    STR_TO_VARSTR(tName, pm->name);
58,871,932✔
3791

3792
    for (int32_t j = 0; j < pm->colNum; j++) {
574,183,916✔
3793
      // table name
3794
      SColumnInfoData *pColInfoData = taosArrayGet(p->pDataBlock, 0);
515,303,680✔
3795
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, tName, false), &lino, _OVER);
515,267,350✔
3796

3797
      // database name
3798
      pColInfoData = taosArrayGet(p->pDataBlock, 1);
515,217,007✔
3799
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, dName, false), &lino, _OVER);
514,999,546✔
3800

3801
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
515,247,109✔
3802
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, typeName, false), &lino, _OVER);
515,253,337✔
3803

3804
      // col name
3805
      char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
515,250,223✔
3806
      STR_TO_VARSTR(colName, pm->schema[j].name);
515,239,843✔
3807
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
515,272,540✔
3808
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, colName, false), &lino, _OVER);
515,304,199✔
3809

3810
      // col type
3811
      int8_t colType = pm->schema[j].type;
515,274,616✔
3812
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
515,277,730✔
3813
      char colTypeStr[VARSTR_HEADER_SIZE + 32];
515,274,616✔
3814
      int  colTypeLen =
3815
          snprintf(varDataVal(colTypeStr), sizeof(colTypeStr) - VARSTR_HEADER_SIZE, "%s", tDataTypes[colType].name);
515,276,173✔
3816
      if (colType == TSDB_DATA_TYPE_VARCHAR) {
515,321,326✔
3817
        colTypeLen +=
269,886,569✔
3818
            snprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d)",
269,886,569✔
3819
                     (int32_t)(pm->schema[j].bytes - VARSTR_HEADER_SIZE));
269,889,683✔
3820
      } else if (colType == TSDB_DATA_TYPE_NCHAR) {
245,431,643✔
UNCOV
3821
        colTypeLen +=
×
UNCOV
3822
            snprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d)",
×
3823
                     (int32_t)((pm->schema[j].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
×
3824
      }
3825
      varDataSetLen(colTypeStr, colTypeLen);
515,318,212✔
3826
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, (char *)colTypeStr, false), &lino, _OVER);
515,216,488✔
3827

3828
      // col length
3829
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
515,267,350✔
3830
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, (const char *)&pm->schema[j].bytes, false), &lino, _OVER);
515,242,957✔
3831

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

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

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

3855
  if (buildWhichDBs & BUILD_COL_FOR_INFO_DB) {
939,729✔
3856
    getInfosDbMeta(&pSysDbTableMeta, &size);
905,738✔
3857
    p->info.rows = buildDbColsInfoBlock(p, pSysDbTableMeta, size, TSDB_INFORMATION_SCHEMA_DB, tb);
905,738✔
3858
  }
3859

3860
  if (buildWhichDBs & BUILD_COL_FOR_PERF_DB) {
939,729✔
3861
    getPerfDbMeta(&pSysDbTableMeta, &size);
905,738✔
3862
    p->info.rows = buildDbColsInfoBlock(p, pSysDbTableMeta, size, TSDB_PERFORMANCE_SCHEMA_DB, tb);
905,738✔
3863
  }
3864

3865
  return p->info.rows;
939,729✔
3866
}
3867

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

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

3894
  buildWhichDBs = determineBuildColForWhichDBs(pShow->db);
943,425✔
3895

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

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

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

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

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

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

3947
      varDataSetLen(stbName, strlen(&stbName[VARSTR_HEADER_SIZE]));
1,825,500✔
3948

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

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

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

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

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

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

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

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

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

4015
      sdbRelease(pSdb, pStb);
1,825,500✔
4016
    }
4017

4018
    if (pDb != NULL) {
943,117✔
4019
      mndReleaseDb(pMnode, pDb);
37,350✔
4020
    }
4021
  }
4022

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

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

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

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

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

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

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

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

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

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

4072
  return code;
4073

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4448
static int32_t mndProcessFetchTtlExpiredTbs(SRpcMsg *pRsp) {
12,276,312✔
4449
  int32_t                 code = -1;
12,276,312✔
4450
  SDecoder                decoder = {0};
12,276,312✔
4451
  SMnode                 *pMnode = pRsp->info.node;
12,276,312✔
4452
  SVFetchTtlExpiredTbsRsp rsp = {0};
12,276,312✔
4453
  SMndDropTbsWithTsmaCtx *pCtx = NULL;
12,276,312✔
4454
  if (pRsp->code != TSDB_CODE_SUCCESS) {
12,276,312✔
4455
    code = pRsp->code;
132,610✔
4456
    goto _end;
132,610✔
4457
  }
4458
  if (pRsp->contLen == 0) {
12,143,702✔
4459
    code = 0;
12,131,549✔
4460
    goto _end;
12,131,549✔
4461
  }
4462

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

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

4470
  code = mndDropTbForSingleVg(pMnode, pCtx, rsp.pExpiredTbs, rsp.vgId);
12,153✔
4471
  if (code) goto _end;
12,153✔
4472
  code = mndCreateDropTbsTxnPrepare(pRsp, pCtx);
12,153✔
4473
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
12,153✔
4474
_end:
12,275,107✔
4475
  if (pCtx) mndDestroyDropTbsWithTsmaCtx(pCtx);
12,276,312✔
4476
  tDecoderClear(&decoder);
12,276,312✔
4477
  tFreeFetchTtlExpiredTbsRsp(&rsp);
12,276,312✔
4478
  TAOS_RETURN(code);
12,276,312✔
4479
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc