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

taosdata / TDengine / #4884

14 Dec 2025 03:48AM UTC coverage: 60.617% (-4.1%) from 64.74%
#4884

push

travis-ci

web-flow
test: update coverage workflow time (#33918)

156854 of 258761 relevant lines covered (60.62%)

75258957.81 hits per line

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

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

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

37
#define STB_VER_NUMBER   3
38
#define STB_RESERVE_SIZE 56
39

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

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

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

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

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

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

104
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STB, mndRetrieveStb);
226,747✔
105
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_STB, mndCancelGetNextStb);
226,747✔
106

107
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_COL, mndRetrieveStbCol);
226,747✔
108
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_COL, mndCancelGetNextStb);
226,747✔
109

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

113
void mndCleanupStb(SMnode *pMnode) {}
226,696✔
114

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

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

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

150
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
549,926,622✔
151
    SSchema *pSchema = &pStb->pColumns[i];
541,256,634✔
152
    SDB_SET_INT8(pRaw, dataPos, pSchema->type, _OVER)
541,256,634✔
153
    SDB_SET_INT8(pRaw, dataPos, pSchema->flags, _OVER)
541,256,634✔
154
    SDB_SET_INT16(pRaw, dataPos, pSchema->colId, _OVER)
541,256,634✔
155
    SDB_SET_INT32(pRaw, dataPos, pSchema->bytes, _OVER)
541,256,634✔
156
    SDB_SET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
541,256,634✔
157
    hasTypeMod = hasTypeMod || HAS_TYPE_MOD(pSchema);
541,256,634✔
158
  }
159

160
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
72,564,081✔
161
    SSchema *pSchema = &pStb->pTags[i];
63,894,093✔
162
    SDB_SET_INT8(pRaw, dataPos, pSchema->type, _OVER)
63,894,093✔
163
    SDB_SET_INT8(pRaw, dataPos, pSchema->flags, _OVER)
63,894,093✔
164
    SDB_SET_INT16(pRaw, dataPos, pSchema->colId, _OVER)
63,894,093✔
165
    SDB_SET_INT32(pRaw, dataPos, pSchema->bytes, _OVER)
63,894,093✔
166
    SDB_SET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
63,894,093✔
167
  }
168

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

174
  if (pStb->commentLen > 0) {
8,669,988✔
175
    SDB_SET_BINARY(pRaw, dataPos, pStb->comment, pStb->commentLen + 1, _OVER)
44,977✔
176
  }
177

178
  if (pStb->ast1Len > 0) {
8,669,988✔
179
    SDB_SET_BINARY(pRaw, dataPos, pStb->pAst1, pStb->ast1Len, _OVER)
×
180
  }
181

182
  if (pStb->ast2Len > 0) {
8,669,988✔
183
    SDB_SET_BINARY(pRaw, dataPos, pStb->pAst2, pStb->ast2Len, _OVER)
×
184
  }
185

186
  if (pStb->pCmpr != NULL) {
8,669,988✔
187
    for (int i = 0; i < pStb->numOfColumns; i++) {
549,926,622✔
188
      SColCmpr *p = &pStb->pCmpr[i];
541,256,634✔
189
      SDB_SET_INT16(pRaw, dataPos, p->id, _OVER)
541,256,634✔
190
      SDB_SET_INT32(pRaw, dataPos, p->alg, _OVER)
541,256,634✔
191
    }
192
  }
193
  SDB_SET_INT64(pRaw, dataPos, pStb->keep, _OVER)
8,669,988✔
194

195
  if (hasTypeMod) {
8,669,988✔
196
    for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
466,182,466✔
197
      SDB_SET_INT32(pRaw, dataPos, pStb->pExtSchemas[i].typeMod, _OVER);
462,584,463✔
198
    }
199
  }
200

201
  SDB_SET_INT8(pRaw, dataPos, pStb->virtualStb, _OVER)
8,669,988✔
202
  SDB_SET_RESERVE(pRaw, dataPos, STB_RESERVE_SIZE, _OVER)
8,669,988✔
203
  SDB_SET_DATALEN(pRaw, dataPos, _OVER)
8,669,988✔
204

205
  terrno = 0;
8,669,988✔
206

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

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

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

226
  int8_t sver = 0;
9,665,003✔
227
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
9,665,003✔
228

229
  if (sver > STB_VER_NUMBER) {
9,665,003✔
230
    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
×
231
    goto _OVER;
×
232
  }
233

234
  pRow = sdbAllocRow(sizeof(SStbObj));
9,665,003✔
235
  if (pRow == NULL) goto _OVER;
9,665,003✔
236

237
  pStb = sdbGetRowObj(pRow);
9,665,003✔
238
  if (pStb == NULL) goto _OVER;
9,665,003✔
239

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

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

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

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

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

295
  if (pStb->commentLen > 0) {
9,665,003✔
296
    pStb->comment = taosMemoryCalloc(pStb->commentLen + 1, 1);
44,055✔
297
    if (pStb->comment == NULL) goto _OVER;
44,055✔
298
    SDB_GET_BINARY(pRaw, dataPos, pStb->comment, pStb->commentLen + 1, _OVER)
44,055✔
299
  }
300

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

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

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

332
  // type mod
333
  if (hasExtSchemas) {
9,665,003✔
334
    pStb->pExtSchemas = taosMemoryCalloc(pStb->numOfColumns, sizeof(SExtSchema));
5,014,148✔
335
    if (!pStb->pExtSchemas) goto _OVER;
5,014,148✔
336
    for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
1,206,283,344✔
337
      SSchema *pSchema = &pStb->pColumns[i];
1,201,269,196✔
338
      SDB_GET_INT32(pRaw, dataPos, &pStb->pExtSchemas[i].typeMod, _OVER)
1,201,269,196✔
339
    }
340
  }
341

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

348
  SDB_GET_RESERVE(pRaw, dataPos, STB_RESERVE_SIZE, _OVER)
9,665,003✔
349

350
  terrno = 0;
9,665,003✔
351

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

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

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

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

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

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

396
  taosWLockLatch(&pOld->lock);
8,166,412✔
397
  int32_t numOfColumns = pOld->numOfColumns;
8,166,412✔
398
  if (pOld->numOfColumns < pNew->numOfColumns) {
8,166,412✔
399
    void *pColumns = taosMemoryMalloc(pNew->numOfColumns * sizeof(SSchema));
1,943,497✔
400
    if (pColumns == NULL) {
1,943,497✔
401
      goto END;
×
402
    }
403
    taosMemoryFree(pOld->pColumns);
1,943,497✔
404
    pOld->pColumns = pColumns;
1,943,497✔
405
  }
406

407
  if (pOld->numOfTags < pNew->numOfTags) {
8,166,412✔
408
    void *pTags = taosMemoryMalloc(pNew->numOfTags * sizeof(SSchema));
220,678✔
409
    if (pTags == NULL) {
220,678✔
410
      goto END;
×
411
    }
412
    taosMemoryFree(pOld->pTags);
220,678✔
413
    pOld->pTags = pTags;
220,678✔
414
  }
415

416
  if (pOld->commentLen < pNew->commentLen && pNew->commentLen > 0) {
8,166,412✔
417
    void *comment = taosMemoryMalloc(pNew->commentLen + 1);
3,024✔
418
    if (comment == NULL) {
3,024✔
419
      goto END;
×
420
    }
421
    taosMemoryFree(pOld->comment);
3,024✔
422
    pOld->comment = comment;
3,024✔
423
  }
424
  pOld->commentLen = pNew->commentLen;
8,166,412✔
425

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

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

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

483
  if (pNew->pExtSchemas) {
8,166,412✔
484
    taosMemoryFreeClear(pOld->pExtSchemas);
4,992,953✔
485
    pOld->pExtSchemas = taosMemoryCalloc(pNew->numOfColumns, sizeof(SExtSchema));
4,992,953✔
486
    if (pOld->pExtSchemas == NULL){
4,992,953✔
487
      goto END;
×
488
    }
489
    memcpy(pOld->pExtSchemas, pNew->pExtSchemas, pNew->numOfColumns * sizeof(SExtSchema));
4,992,953✔
490
  }
491

492
END:
3,173,459✔
493
  taosWUnLockLatch(&pOld->lock);
8,166,412✔
494
  return terrno;
8,166,412✔
495
}
496

497
SStbObj *mndAcquireStb(SMnode *pMnode, char *stbName) {
17,625,759✔
498
  SSdb    *pSdb = pMnode->pSdb;
17,625,759✔
499
  SStbObj *pStb = sdbAcquire(pSdb, SDB_STB, stbName);
17,625,759✔
500
  if (pStb == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
17,625,759✔
501
    terrno = TSDB_CODE_MND_STB_NOT_EXIST;
1,469,977✔
502
  }
503
  return pStb;
17,625,759✔
504
}
505

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

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

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

518
  return mndAcquireDb(pMnode, db);
5,052,581✔
519
}
520

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

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

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

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

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

566
  req.colCmpr.pColCmpr = taosMemoryCalloc(pCmpr->nCols, sizeof(SColCmpr));
6,253,811✔
567
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
529,828,916✔
568
    SColCmpr *p = &pCmpr->pColCmpr[i];
523,575,105✔
569
    p->alg = pStb->pCmpr[i].alg;
523,575,105✔
570
    p->id = pStb->pCmpr[i].id;
523,575,105✔
571
  }
572

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

581
  contLen += sizeof(SMsgHead);
6,253,811✔
582

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

589
  pHead->contLen = htonl(contLen);
6,253,811✔
590
  pHead->vgId = htonl(pVgroup->vgId);
6,253,811✔
591

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

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

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

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

627
  req.name = (char *)tNameGetTableName(&name);
2,393,205✔
628
  req.suid = pStb->uid;
2,393,205✔
629

630
  tEncodeSize(tEncodeSVDropStbReq, &req, contLen, ret);
2,393,205✔
631
  if (ret < 0) return NULL;
2,393,205✔
632

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

640
  pHead->contLen = htonl(contLen);
2,393,205✔
641
  pHead->vgId = htonl(pVgroup->vgId);
2,393,205✔
642

643
  void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
2,393,205✔
644

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

653
  *pContLen = contLen;
2,393,205✔
654
  return pHead;
2,393,205✔
655
}
656

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

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

669
  if (pCreate->numOfColumns < TSDB_MIN_COLUMNS || pCreate->numOfTags + pCreate->numOfColumns > TSDB_MAX_COLUMNS) {
855,693✔
670
    code = TSDB_CODE_PAR_INVALID_COLUMNS_NUM;
×
671
    TAOS_RETURN(code);
×
672
  }
673

674
  if (pCreate->numOfTags <= 0 || pCreate->numOfTags > TSDB_MAX_TAGS) {
855,693✔
675
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
676
    TAOS_RETURN(code);
×
677
  }
678

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

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

701
  for (int32_t i = 0; i < pCreate->numOfTags; ++i) {
4,726,488✔
702
    SField *pField1 = taosArrayGet(pCreate->pTags, i);
3,870,795✔
703
    if (pField1->type >= TSDB_DATA_TYPE_MAX) {
3,870,795✔
704
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
705
      TAOS_RETURN(code);
×
706
    }
707
    if (pField1->bytes <= 0) {
3,870,795✔
708
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
709
      TAOS_RETURN(code);
×
710
    }
711
    if (pField1->name[0] == 0) {
3,870,795✔
712
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
713
      TAOS_RETURN(code);
×
714
    }
715
  }
716

717
  TAOS_RETURN(code);
855,693✔
718
}
719

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

734
  TAOS_RETURN(code);
×
735
}
736

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

751
  TAOS_RETURN(code);
843,249✔
752
}
753

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

761
  while (1) {
2,965,095✔
762
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
3,806,352✔
763
    if (pIter == NULL) break;
3,806,352✔
764
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
2,965,095✔
765
      sdbRelease(pSdb, pVgroup);
1,119,277✔
766
      continue;
1,119,277✔
767
    }
768

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

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

795
  TAOS_RETURN(code);
841,257✔
796
}
797

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

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

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

824
  TAOS_RETURN(code);
×
825
}
826

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

833
  while (1) {
2,965,095✔
834
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
3,806,352✔
835
    if (pIter == NULL) break;
3,806,352✔
836
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
2,965,095✔
837
      sdbRelease(pSdb, pVgroup);
1,119,277✔
838
      continue;
1,119,277✔
839
    }
840

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

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

865
  TAOS_RETURN(code);
841,257✔
866
}
867

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

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

908
  if (pDst->commentLen > 0) {
843,855✔
909
    pDst->comment = taosMemoryCalloc(pDst->commentLen + 1, 1);
5,980✔
910
    if (pDst->comment == NULL) {
5,980✔
911
      code = terrno;
×
912
      TAOS_RETURN(code);
×
913
    }
914
    memcpy(pDst->comment, pCreate->pComment, pDst->commentLen + 1);
5,980✔
915
  }
916

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

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

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

944
  if (pDst->nextColId < 0 || pDst->nextColId >= 0x7fff - pDst->numOfColumns - pDst->numOfTags) {
843,855✔
945
    code = TSDB_CODE_OUT_OF_RANGE;
×
946
    TAOS_RETURN(code);
×
947
  }
948

949
  for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
23,699,613✔
950
    SFieldWithOptions *pField = taosArrayGet(pCreate->pColumns, i);
22,855,758✔
951
    SSchema           *pSchema = &pDst->pColumns[i];
22,855,758✔
952
    pSchema->type = pField->type;
22,855,758✔
953
    pSchema->bytes = pField->bytes;
22,855,758✔
954
    pSchema->flags = pField->flags;
22,855,758✔
955
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
22,855,758✔
956
    pSchema->colId = pDst->nextColId;
22,855,758✔
957
    pDst->nextColId++;
22,855,758✔
958
    hasTypeMods = hasTypeMods || HAS_TYPE_MOD(pSchema);
22,855,758✔
959
  }
960

961
  for (int32_t i = 0; i < pDst->numOfTags; ++i) {
4,634,105✔
962
    SField  *pField = taosArrayGet(pCreate->pTags, i);
3,790,250✔
963
    SSchema *pSchema = &pDst->pTags[i];
3,790,250✔
964
    pSchema->type = pField->type;
3,790,250✔
965
    pSchema->bytes = pField->bytes;
3,790,250✔
966
    if (i == 0) {
3,790,250✔
967
      SSCHMEA_SET_IDX_ON(pSchema);
843,855✔
968
    }
969
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
3,790,250✔
970
    pSchema->colId = pDst->nextColId;
3,790,250✔
971
    pDst->nextColId++;
3,790,250✔
972
  }
973
  // set col compress
974
  pDst->pCmpr = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SCmprObj));
843,855✔
975
  for (int32_t i = 0; i < pDst->numOfColumns; i++) {
23,699,613✔
976
    SFieldWithOptions *pField = taosArrayGet(pCreate->pColumns, i);
22,855,758✔
977
    SSchema           *pSchema = &pDst->pColumns[i];
22,855,758✔
978

979
    SColCmpr *pColCmpr = &pDst->pCmpr[i];
22,855,758✔
980
    pColCmpr->id = pSchema->colId;
22,855,758✔
981
    pColCmpr->alg = pField->compress;
22,855,758✔
982
  }
983

984
  if (hasTypeMods) {
843,855✔
985
    pDst->pExtSchemas = taosMemoryCalloc(pDst->numOfColumns, sizeof(SExtSchema));
6,610✔
986
    if (!pDst->pExtSchemas) {
6,610✔
987
      code = terrno;
×
988
      TAOS_RETURN(code);
×
989
    }
990
    for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
86,352✔
991
      SFieldWithOptions * pField = taosArrayGet(pCreate->pColumns, i);
79,742✔
992
      pDst->pExtSchemas[i].typeMod = pField->typeMod;
79,742✔
993
    }
994
  }
995
  TAOS_RETURN(code);
843,855✔
996
}
997
int32_t mndGenIdxNameForFirstTag(char *fullname, char *dbname, char *stbname, char *tagname) {
842,291✔
998
  SName name = {0};
842,291✔
999
  if ((terrno = tNameFromString(&name, stbname, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0) {
842,291✔
1000
    return -1;
×
1001
  }
1002
  return snprintf(fullname, TSDB_INDEX_FNAME_LEN, "%s.%s_%s", dbname, tagname, tNameGetTableName(&name));
842,291✔
1003
}
1004

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

1009
  char fullIdxName[TSDB_INDEX_FNAME_LEN * 2] = {0};
840,299✔
1010

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

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

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

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

1042
  TAOS_CHECK_GOTO(mndSetCreateIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
840,299✔
1043

1044
  TAOS_CHECK_GOTO(mndAddStbToTrans(pMnode, pTrans, pDb, &stbObj), NULL, _OVER);
840,299✔
1045
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
837,701✔
1046
  code = 0;
837,701✔
1047

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

1054
int32_t mndAddStbToTrans(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
843,855✔
1055
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
843,855✔
1056
  TAOS_CHECK_RETURN(mndTransCheckConflict(pMnode, pTrans));
843,855✔
1057
  TAOS_CHECK_RETURN(mndSetCreateStbCommitLogs(pMnode, pTrans, pDb, pStb));
841,257✔
1058
  TAOS_CHECK_RETURN(mndSetCreateStbRedoActions(pMnode, pTrans, pDb, pStb));
841,257✔
1059
  TAOS_CHECK_RETURN(mndSetCreateStbUndoActions(pMnode, pTrans, pDb, pStb));
841,257✔
1060
  return 0;
841,257✔
1061
}
1062

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

1073
  mDebug("start to process ttl timer");
973,702✔
1074

1075
  while (1) {
3,355,664✔
1076
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
4,329,366✔
1077
    if (pIter == NULL) break;
4,329,366✔
1078

1079
    if (pVgroup->mountVgId) {
3,355,664✔
1080
      sdbRelease(pSdb, pVgroup);
2,012✔
1081
      continue;
2,012✔
1082
    }
1083

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

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

1110
  return 0;
973,702✔
1111
}
1112

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

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

1137
    int32_t code = 0;
1138

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

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

1164
  return 0;
1165
}
1166
#endif
1167

1168
static int32_t mndFindSuperTableTagIndex(const SStbObj *pStb, const char *tagName) {
2,455,636✔
1169
  for (int32_t tag = 0; tag < pStb->numOfTags; tag++) {
24,773,061✔
1170
    if (strcmp(pStb->pTags[tag].name, tagName) == 0) {
22,848,662✔
1171
      return tag;
531,237✔
1172
    }
1173
  }
1174

1175
  return -1;
1,924,399✔
1176
}
1177

1178
static int32_t mndFindSuperTableColumnIndex(const SStbObj *pStb, const char *colName) {
3,667,154✔
1179
  for (int32_t col = 0; col < pStb->numOfColumns; col++) {
223,028,501✔
1180
    if (strcmp(pStb->pColumns[col].name, colName) == 0) {
221,062,728✔
1181
      return col;
1,701,381✔
1182
    }
1183
  }
1184

1185
  return -1;
1,965,773✔
1186
}
1187

1188
static bool mndValidateSchema(SSchema *pSchemas, int32_t nSchema, SArray *pFields, int32_t maxLen) {
2,035,811✔
1189
  int32_t rowLen = 0;
2,035,811✔
1190
  for (int32_t i = 0; i < nSchema; ++i) {
133,240,023✔
1191
    rowLen += (pSchemas + i)->bytes;
131,204,212✔
1192
  }
1193

1194
  int32_t nField = taosArrayGetSize(pFields);
2,035,811✔
1195
  for (int32_t i = 0; i < nField; ++i) {
4,071,622✔
1196
    rowLen += ((SField *)TARRAY_GET_ELEM(pFields, i))->bytes;
2,035,811✔
1197
  }
1198

1199
  return rowLen <= maxLen;
2,035,811✔
1200
}
1201

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

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

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

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

1227
  for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
52,164✔
1228
    SFieldWithOptions *pField = taosArrayGet(createReq->pColumns, i);
45,362✔
1229
    SSchema           *pSchema = &pDst->pColumns[i];
45,362✔
1230
    pSchema->type = pField->type;
45,362✔
1231
    pSchema->bytes = pField->bytes;
45,362✔
1232
    pSchema->flags = pField->flags;
45,362✔
1233
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
45,362✔
1234
    int32_t cIndex = mndFindSuperTableColumnIndex(pStb, pField->name);
45,362✔
1235
    if (cIndex >= 0) {
45,362✔
1236
      pSchema->colId = pStb->pColumns[cIndex].colId;
42,102✔
1237
    } else {
1238
      pSchema->colId = pDst->nextColId++;
3,260✔
1239
    }
1240
  }
1241

1242
  for (int32_t i = 0; i < pDst->numOfTags; ++i) {
55,888✔
1243
    SField  *pField = taosArrayGet(createReq->pTags, i);
49,086✔
1244
    SSchema *pSchema = &pDst->pTags[i];
49,086✔
1245
    pSchema->type = pField->type;
49,086✔
1246
    pSchema->bytes = pField->bytes;
49,086✔
1247
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
49,086✔
1248
    int32_t cIndex = mndFindSuperTableTagIndex(pStb, pField->name);
49,086✔
1249
    if (cIndex >= 0) {
49,086✔
1250
      pSchema->colId = pStb->pTags[cIndex].colId;
46,162✔
1251
    } else {
1252
      pSchema->colId = pDst->nextColId++;
2,924✔
1253
    }
1254
  }
1255
  for (int32_t i = 0; i < pDst->numOfColumns; i++) {
52,164✔
1256
    SColCmpr          *p = pDst->pCmpr + i;
45,362✔
1257
    SFieldWithOptions *pField = taosArrayGet(createReq->pColumns, i);
45,362✔
1258
    SSchema           *pSchema = &pDst->pColumns[i];
45,362✔
1259
    p->id = pSchema->colId;
45,362✔
1260
    if (pField->compress == 0) {
45,362✔
1261
      p->alg = createDefaultColCmprByType(pSchema->type);
×
1262
    } else {
1263
      p->alg = pField->compress;
45,362✔
1264
    }
1265
    if (pField->flags & COL_HAS_TYPE_MOD) {
45,362✔
1266
      pDst->pExtSchemas[i].typeMod = pField->typeMod;
×
1267
    }
1268
  }
1269
  pDst->tagVer = createReq->tagVer;
6,802✔
1270
  pDst->colVer = createReq->colVer;
6,802✔
1271
  return TSDB_CODE_SUCCESS;
6,802✔
1272
}
1273

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

1301
  for (int32_t i = 0; i < pDst->numOfTags && taosArrayGetSize(alterReq.pFields) == 0; ++i) {
37,286✔
1302
    SSchema *pSchema = &pDst->pTags[i];
30,484✔
1303
    int32_t cIndex = mndFindSuperTableTagIndex(pStb, pSchema->name);
30,484✔
1304
    if (cIndex >= 0 && pSchema->bytes == pStb->pTags[cIndex].bytes) {
30,484✔
1305
      continue;
27,448✔
1306
    }
1307
    if (cIndex < 0) {
3,036✔
1308
      alterReq.alterType = TSDB_ALTER_TABLE_ADD_TAG;
2,924✔
1309
    } else if (pSchema->bytes > pStb->pTags[cIndex].bytes){
112✔
1310
      alterReq.alterType = TSDB_ALTER_TABLE_UPDATE_TAG_BYTES;
112✔
1311
    }
1312
    SField *pAlterField = taosArrayReserve(alterReq.pFields, 1);
3,036✔
1313
    pAlterField->type = pSchema->type;
3,036✔
1314
    pAlterField->bytes = pSchema->bytes;
3,036✔
1315
    tstrncpy(pAlterField->name, pSchema->name, TSDB_COL_NAME_LEN);
3,036✔
1316
    mDebug("alter tag name:%s, type:%d, bytes:%d", pAlterField->name, pAlterField->type, pAlterField->bytes);
3,036✔
1317
  }
1318
  alterReq.numOfFields = taosArrayGetSize(alterReq.pFields);
6,802✔
1319
  if (alterReq.numOfFields == 0) {
6,802✔
1320
    mError("no valid alter field found");
×
1321
    goto END;
×
1322
  }
1323

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

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

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

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

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

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

1421
  for (int32_t i = 0; i < createReq.numOfColumns; ++i) {
23,726,623✔
1422
    SFieldWithOptions *pField = taosArrayGet(createReq.pColumns, i);
22,879,522✔
1423
    if ((code = taosHashPut(pHash, pField->name, strlen(pField->name), NULL, 0)) != 0) {
22,879,522✔
1424
      if (code == TSDB_CODE_DUP_KEY) {
×
1425
        code = TSDB_CODE_TSC_DUP_COL_NAMES;
×
1426
      }
1427
      goto _OVER;
×
1428
    }
1429
  }
1430

1431
  for (int32_t i = 0; i < createReq.numOfTags; ++i) {
4,682,881✔
1432
    SField *pField = taosArrayGet(createReq.pTags, i);
3,835,780✔
1433
    if ((code = taosHashPut(pHash, pField->name, strlen(pField->name), NULL, 0)) != 0) {
3,835,780✔
1434
      if (code == TSDB_CODE_DUP_KEY) {
×
1435
        code = TSDB_CODE_TSC_DUP_COL_NAMES;
×
1436
      }
1437
      goto _OVER;
×
1438
    }
1439
  }
1440

1441
  pDb = mndAcquireDbByStb(pMnode, createReq.name);
847,101✔
1442
  if (pDb == NULL) {
847,101✔
1443
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
1444
    goto _OVER;
×
1445
  }
1446

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

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

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

1465
  if ((code = grantCheck(TSDB_GRANT_STABLE)) < 0) {
847,101✔
1466
    goto _OVER;
×
1467
  }
1468

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

1493
  SName name = {0};
847,101✔
1494
  TAOS_CHECK_RETURN(tNameFromString(&name, createReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
847,101✔
1495

1496
  if (createReq.sql == NULL && createReq.sqlLen == 0) {
847,101✔
1497
    char detail[1000] = {0};
203,438✔
1498

1499
    (void)tsnprintf(detail, sizeof(detail), "dbname:%s, stable name:%s", name.dbname, name.tname);
203,438✔
1500

1501
    auditRecord(pReq, pMnode->clusterId, "createStb", name.dbname, name.tname, detail, strlen(detail));
203,438✔
1502
  } else {
1503
    auditRecord(pReq, pMnode->clusterId, "createStb", name.dbname, name.tname, createReq.sql, createReq.sqlLen);
643,663✔
1504
  }
1505
_OVER:
852,137✔
1506
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
852,137✔
1507
    mError("stb:%s, failed to create since %s", createReq.name, tstrerror(code));
3,406✔
1508
  }
1509

1510
  mndReleaseStb(pMnode, pStb);
852,137✔
1511
  mndReleaseDb(pMnode, pDb);
852,137✔
1512
  tFreeSMCreateStbReq(&createReq);
852,137✔
1513

1514
  if (pHash != NULL) {
852,137✔
1515
    taosHashCleanup(pHash);
847,101✔
1516
  }
1517

1518
  TAOS_RETURN(code);
852,137✔
1519
}
1520

1521
static int32_t mndCheckAlterStbReq(SMAlterStbReq *pAlter) {
3,923,495✔
1522
  int32_t code = 0;
3,923,495✔
1523
  if (pAlter->commentLen >= 0) return 0;
3,923,495✔
1524
  if (pAlter->ttl != 0) return 0;
9,047✔
1525
  if (pAlter->keep != -1) return 0;
9,047✔
1526

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

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

1540
  TAOS_RETURN(code);
×
1541
}
1542

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

1551
  memcpy(pNew->pColumns, pOld->pColumns, sizeof(SSchema) * pOld->numOfColumns);
3,758,911✔
1552
  memcpy(pNew->pTags, pOld->pTags, sizeof(SSchema) * pOld->numOfTags);
3,758,911✔
1553
  memcpy(pNew->pCmpr, pOld->pCmpr, sizeof(SColCmpr) * pOld->numOfColumns);
3,758,911✔
1554
  if (pOld->pExtSchemas) {
3,758,911✔
1555
    pNew->pExtSchemas = taosMemoryCalloc(pNew->numOfColumns, sizeof(SExtSchema));
3,053,245✔
1556
    if (pNew->pExtSchemas == NULL) {
3,053,245✔
1557
      TAOS_RETURN(terrno);
×
1558
    }
1559
    memcpy(pNew->pExtSchemas, pOld->pExtSchemas, sizeof(SExtSchema) * pOld->numOfColumns);
3,053,245✔
1560
  }
1561

1562
  TAOS_RETURN(0);
3,758,911✔
1563
}
1564

1565
static int32_t mndUpdateTableOptions(const SStbObj *pOld, SStbObj *pNew, char *pComment, int32_t commentLen,
14,851✔
1566
                                     int32_t ttl, int64_t keep) {
1567
  int32_t code = 0;
14,851✔
1568
  if (commentLen > 0) {
14,851✔
1569
    pNew->commentLen = commentLen;
3,024✔
1570
    pNew->comment = taosMemoryCalloc(1, commentLen + 1);
3,024✔
1571
    if (pNew->comment == NULL) {
3,024✔
1572
      terrno = TSDB_CODE_OUT_OF_MEMORY;
×
1573
      return -1;
×
1574
    }
1575
    memcpy(pNew->comment, pComment, commentLen + 1);
3,024✔
1576
  } else if (commentLen == 0) {
11,827✔
1577
    pNew->commentLen = 0;
2,780✔
1578
  } else {
1579
  }
1580

1581
  if (ttl >= 0) {
14,851✔
1582
    pNew->ttl = ttl;
14,851✔
1583
  }
1584

1585
  if (keep > 0) {
14,851✔
1586
    pNew->keep = keep;
9,047✔
1587
  }
1588

1589
  if ((code = mndAllocStbSchemas(pOld, pNew)) != 0) {
14,851✔
1590
    TAOS_RETURN(code);
×
1591
  }
1592
  TAOS_RETURN(code);
14,851✔
1593
}
1594

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

1602
  if (pOld->numOfColumns + ntags + pOld->numOfTags > TSDB_MAX_COLUMNS) {
192,796✔
1603
    code = TSDB_CODE_MND_TOO_MANY_COLUMNS;
×
1604
    TAOS_RETURN(code);
×
1605
  }
1606

1607
  if (!mndValidateSchema(pOld->pTags, pOld->numOfTags, pFields, TSDB_MAX_TAGS_LEN)) {
192,796✔
1608
    code = TSDB_CODE_PAR_INVALID_TAGS_LENGTH;
18,327✔
1609
    TAOS_RETURN(code);
18,327✔
1610
  }
1611

1612
  pNew->numOfTags = pNew->numOfTags + ntags;
174,469✔
1613
  if ((code = mndAllocStbSchemas(pOld, pNew)) != 0) {
174,469✔
1614
    TAOS_RETURN(code);
×
1615
  }
1616

1617
  if (pNew->nextColId < 0 || pNew->nextColId >= 0x7fff - ntags) {
174,469✔
1618
    code = TSDB_CODE_OUT_OF_RANGE;
×
1619
    TAOS_RETURN(code);
×
1620
  }
1621

1622
  for (int32_t i = 0; i < ntags; i++) {
307,347✔
1623
    SField *pField = taosArrayGet(pFields, i);
174,469✔
1624
    if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
174,469✔
1625
      code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
1,353✔
1626
      TAOS_RETURN(code);
1,353✔
1627
    }
1628

1629
    if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
173,116✔
1630
      code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
40,238✔
1631
      TAOS_RETURN(code);
40,238✔
1632
    }
1633

1634
    SSchema *pSchema = &pNew->pTags[pOld->numOfTags + i];
132,878✔
1635
    pSchema->bytes = pField->bytes;
132,878✔
1636
    pSchema->type = pField->type;
132,878✔
1637
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
132,878✔
1638
    pSchema->colId = pNew->nextColId;
132,878✔
1639
    pNew->nextColId++;
132,878✔
1640

1641
    mInfo("stb:%s, start to add tag %s", pNew->name, pSchema->name);
132,878✔
1642
  }
1643

1644
  pNew->tagVer++;
132,878✔
1645
  TAOS_RETURN(code);
132,878✔
1646
}
1647

1648
static int32_t mndCheckAlterColForTopic(SMnode *pMnode, const char *stbFullName, int64_t suid, col_id_t colId) {
1,794,586✔
1649
  int32_t code = 0;
1,794,586✔
1650
  SSdb   *pSdb = pMnode->pSdb;
1,794,586✔
1651
  void   *pIter = NULL;
1,794,586✔
1652
  while (1) {
×
1653
    SMqTopicObj *pTopic = NULL;
1,794,586✔
1654
    pIter = sdbFetch(pSdb, SDB_TOPIC, pIter, (void **)&pTopic);
1,794,586✔
1655
    if (pIter == NULL) break;
1,794,586✔
1656

1657
    mInfo("topic:%s, check tag and column modifiable, stb:%s suid:%" PRId64 " colId:%d, subType:%d sql:%s",
×
1658
          pTopic->name, stbFullName, suid, colId, pTopic->subType, pTopic->sql);
1659
    if (pTopic->ast == NULL) {
×
1660
      sdbRelease(pSdb, pTopic);
×
1661
      continue;
×
1662
    }
1663

1664
    SNode *pAst = NULL;
×
1665
    if (nodesStringToNode(pTopic->ast, &pAst) != 0) {
×
1666
      code = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TOPIC;
×
1667
      mError("topic:%s, create ast error", pTopic->name);
×
1668
      sdbRelease(pSdb, pTopic);
×
1669
      sdbCancelFetch(pSdb, pIter);
×
1670
      TAOS_RETURN(code);
×
1671
    }
1672

1673
    SNodeList *pNodeList = NULL;
×
1674
    if ((code = nodesCollectColumns((SSelectStmt *)pAst, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pNodeList)) !=
×
1675
        0) {
1676
      sdbRelease(pSdb, pTopic);
×
1677
      sdbCancelFetch(pSdb, pIter);
×
1678
      TAOS_RETURN(code);
×
1679
    }
1680
    SNode *pNode = NULL;
×
1681
    FOREACH(pNode, pNodeList) {
×
1682
      SColumnNode *pCol = (SColumnNode *)pNode;
×
1683
      mInfo("topic:%s, check colId:%d tableId:%" PRId64 " ctbStbUid:%" PRId64, pTopic->name, pCol->colId, pCol->tableId,
×
1684
            pTopic->ctbStbUid);
1685

1686
      if (pCol->tableId != suid && pTopic->ctbStbUid != suid) {
×
1687
        mInfo("topic:%s, check colId:%d passed", pTopic->name, pCol->colId);
×
1688
        goto NEXT;
×
1689
      }
1690
      if (pCol->colId > 0 && pCol->colId == colId) {
×
1691
        code = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TOPIC;
×
1692
        mError("topic:%s, check colId:%d conflicted", pTopic->name, pCol->colId);
×
1693
        nodesDestroyNode(pAst);
×
1694
        nodesDestroyList(pNodeList);
×
1695
        sdbCancelFetch(pSdb, pIter);
×
1696
        sdbRelease(pSdb, pTopic);
×
1697
        TAOS_RETURN(code);
×
1698
      }
1699
      mInfo("topic:%s, check colId:%d passed", pTopic->name, pCol->colId);
×
1700
    }
1701

1702
  NEXT:
×
1703
    sdbRelease(pSdb, pTopic);
×
1704
    nodesDestroyNode(pAst);
×
1705
    nodesDestroyList(pNodeList);
×
1706
  }
1707
  TAOS_RETURN(code);
1,794,586✔
1708
}
1709

1710
static int32_t mndCheckAlterColForStream(SMnode *pMnode, const char *stbFullName, int64_t suid, col_id_t colId) {
1,794,586✔
1711
  return 0;
1,794,586✔
1712
  
1713
  /* STREAMTODO
1714
  int32_t code = 0;
1715
  SSdb   *pSdb = pMnode->pSdb;
1716
  void   *pIter = NULL;
1717
  while (1) {
1718
    SStreamObj *pStream = NULL;
1719
    pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
1720
    if (pIter == NULL) break;
1721

1722
    SNode *pAst = NULL;
1723
    if (nodesStringToNode(pStream->ast, &pAst) != 0) {
1724
      code = TSDB_CODE_MND_INVALID_STREAM_OPTION;
1725
      mError("stream:%s, create ast error", pStream->name);
1726
      sdbRelease(pSdb, pStream);
1727
      sdbCancelFetch(pSdb, pIter);
1728
      TAOS_RETURN(code);
1729
    }
1730

1731
    SNodeList *pNodeList = NULL;
1732
    if ((code = nodesCollectColumns((SSelectStmt *)pAst, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pNodeList)) !=
1733
        0) {
1734
      sdbRelease(pSdb, pStream);
1735
      sdbCancelFetch(pSdb, pIter);
1736
      TAOS_RETURN(code);
1737
    }
1738

1739
    SNode *pNode = NULL;
1740
    FOREACH(pNode, pNodeList) {
1741
      SColumnNode *pCol = (SColumnNode *)pNode;
1742

1743
      if (pCol->tableId != suid) {
1744
        mInfo("stream:%s, check colId:%d passed", pStream->name, pCol->colId);
1745
        goto NEXT;
1746
      }
1747
      if (pCol->colId > 0 && pCol->colId == colId) {
1748
        code = TSDB_CODE_MND_STREAM_MUST_BE_DELETED;
1749
        mError("stream:%s, check colId:%d conflicted", pStream->name, pCol->colId);
1750
        nodesDestroyNode(pAst);
1751
        nodesDestroyList(pNodeList);
1752
        sdbRelease(pSdb, pStream);
1753
        sdbCancelFetch(pSdb, pIter);
1754
        TAOS_RETURN(code);
1755
      }
1756
      mInfo("stream:%s, check colId:%d passed", pStream->name, pCol->colId);
1757
    }
1758

1759
  NEXT:
1760
    sdbRelease(pSdb, pStream);
1761
  }
1762
  TAOS_RETURN(code);
1763
*/  
1764
}
1765

1766
static int32_t mndCheckAlterColForTSma(SMnode *pMnode, const char *stbFullName, int64_t suid, col_id_t colId, bool isTag) {
1,794,586✔
1767
  int32_t code = 0;
1,794,586✔
1768
  SSdb   *pSdb = pMnode->pSdb;
1,794,586✔
1769
  void   *pIter = NULL;
1,794,586✔
1770
  while (1) {
×
1771
    SSmaObj *pSma = NULL;
1,794,586✔
1772
    pIter = sdbFetch(pSdb, SDB_SMA, pIter, (void **)&pSma);
1,794,586✔
1773
    if (pIter == NULL) break;
1,794,586✔
1774

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

1778
    if (isTag) {
×
1779
      code = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TSMA;
×
1780
      mError("tsma:%s, check tag:%d conflicted", pSma->name, colId);
×
1781
      sdbRelease(pSdb, pSma);
×
1782
      sdbCancelFetch(pSdb, pIter);
×
1783
      TAOS_RETURN(code);
×
1784
    }
1785

1786
    SNode *pAst = NULL;
×
1787
    if (nodesStringToNode(pSma->ast, &pAst) != 0) {
×
1788
      code = TSDB_CODE_SDB_INVALID_DATA_CONTENT;
×
1789
      mError("tsma:%s, check tag and column modifiable, stb:%s suid:%" PRId64 " colId:%d failed since parse AST err",
×
1790
             pSma->name, stbFullName, suid, colId);
1791
      sdbCancelFetch(pSdb, pIter);
×
1792
      TAOS_RETURN(code);
×
1793
    }
1794

1795
    SNodeList *pNodeList = NULL;
×
1796
    if ((code = nodesCollectColumns((SSelectStmt *)pAst, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pNodeList)) !=
×
1797
        0) {
1798
      sdbCancelFetch(pSdb, pIter);
×
1799
      TAOS_RETURN(code);
×
1800
    }
1801
    SNode *pNode = NULL;
×
1802
    FOREACH(pNode, pNodeList) {
×
1803
      SColumnNode *pCol = (SColumnNode *)pNode;
×
1804
      mInfo("tsma:%s, check colId:%d tableId:%" PRId64, pSma->name, pCol->colId, pCol->tableId);
×
1805

1806
      if ((pCol->tableId != suid) && (pSma->stbUid != suid)) {
×
1807
        mInfo("tsma:%s, check colId:%d passed", pSma->name, pCol->colId);
×
1808
        goto NEXT;
×
1809
      }
1810
      if ((pCol->colId) > 0 && (pCol->colId == colId)) {
×
1811
        code = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TSMA;
×
1812
        mError("tsma:%s, check colId:%d conflicted", pSma->name, pCol->colId);
×
1813
        nodesDestroyNode(pAst);
×
1814
        nodesDestroyList(pNodeList);
×
1815
        sdbRelease(pSdb, pSma);
×
1816
        sdbCancelFetch(pSdb, pIter);
×
1817
        TAOS_RETURN(code);
×
1818
      }
1819
      mInfo("tsma:%s, check colId:%d passed", pSma->name, pCol->colId);
×
1820
    }
1821

1822
  NEXT:
×
1823
    sdbRelease(pSdb, pSma);
×
1824
    nodesDestroyNode(pAst);
×
1825
    nodesDestroyList(pNodeList);
×
1826
  }
1827
  TAOS_RETURN(code);
1,794,586✔
1828
}
1829

1830
int32_t mndCheckColAndTagModifiable(SMnode *pMnode, const char *stbFullName, int64_t suid, col_id_t colId, bool isTag) {
1,794,586✔
1831
  TAOS_CHECK_RETURN(mndCheckAlterColForTopic(pMnode, stbFullName, suid, colId));
1,794,586✔
1832
  TAOS_CHECK_RETURN(mndCheckAlterColForStream(pMnode, stbFullName, suid, colId));
1,794,586✔
1833
  TAOS_CHECK_RETURN(mndCheckAlterColForTSma(pMnode, stbFullName, suid, colId, isTag));
1,794,586✔
1834
  TAOS_RETURN(0);
1,794,586✔
1835
}
1836

1837
static int32_t mndDropSuperTableTag(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const char *tagName) {
79,703✔
1838
  int32_t code = 0;
79,703✔
1839
  int32_t tag = mndFindSuperTableTagIndex(pOld, tagName);
79,703✔
1840
  if (tag < 0) {
79,703✔
1841
    code = TSDB_CODE_MND_TAG_NOT_EXIST;
×
1842
    TAOS_RETURN(code);
×
1843
  }
1844

1845
  col_id_t colId = pOld->pTags[tag].colId;
79,703✔
1846
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId, true));
79,703✔
1847

1848
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
79,703✔
1849

1850
  memmove(pNew->pTags + tag, pNew->pTags + tag + 1, sizeof(SSchema) * (pNew->numOfTags - tag - 1));
79,703✔
1851
  pNew->numOfTags--;
79,703✔
1852

1853
  pNew->tagVer++;
79,703✔
1854

1855
  // if (mndDropIndexByTag(pMnode, pOld, tagName) != 0) {
1856
  //   return -1;
1857
  // }
1858
  mInfo("stb:%s, start to drop tag %s", pNew->name, tagName);
79,703✔
1859
  TAOS_RETURN(code);
79,703✔
1860
}
1861

1862
static int32_t mndAlterStbTagName(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, SArray *pFields) {
117,354✔
1863
  int32_t code = 0;
117,354✔
1864
  if ((int32_t)taosArrayGetSize(pFields) != 2) {
117,354✔
1865
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
1866
    TAOS_RETURN(code);
×
1867
  }
1868

1869
  SField *pField0 = taosArrayGet(pFields, 0);
117,354✔
1870
  SField *pField1 = taosArrayGet(pFields, 1);
117,354✔
1871

1872
  const char *oldTagName = pField0->name;
117,354✔
1873
  const char *newTagName = pField1->name;
117,354✔
1874

1875
  int32_t tag = mndFindSuperTableTagIndex(pOld, oldTagName);
117,354✔
1876
  if (tag < 0) {
117,354✔
1877
    code = TSDB_CODE_MND_TAG_NOT_EXIST;
2,242✔
1878
    TAOS_RETURN(code);
2,242✔
1879
  }
1880

1881
  col_id_t colId = pOld->pTags[tag].colId;
115,112✔
1882
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId, true));
115,112✔
1883

1884
  if (mndFindSuperTableTagIndex(pOld, newTagName) >= 0) {
115,112✔
1885
    code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
4,023✔
1886
    TAOS_RETURN(code);
4,023✔
1887
  }
1888

1889
  if (mndFindSuperTableColumnIndex(pOld, newTagName) >= 0) {
111,089✔
1890
    code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
×
1891
    TAOS_RETURN(code);
×
1892
  }
1893

1894
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
111,089✔
1895

1896
  SSchema *pSchema = (SSchema *)(pNew->pTags + tag);
111,089✔
1897
  memcpy(pSchema->name, newTagName, TSDB_COL_NAME_LEN);
111,089✔
1898

1899
  pNew->tagVer++;
111,089✔
1900
  mInfo("stb:%s, start to modify tag %s to %s", pNew->name, oldTagName, newTagName);
111,089✔
1901
  TAOS_RETURN(code);
111,089✔
1902
}
1903

1904
static int32_t mndAlterStbTagBytes(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const SField *pField) {
217,086✔
1905
  int32_t code = 0;
217,086✔
1906
  int32_t tag = mndFindSuperTableTagIndex(pOld, pField->name);
217,086✔
1907
  if (tag < 0) {
217,086✔
1908
    code = TSDB_CODE_MND_TAG_NOT_EXIST;
×
1909
    TAOS_RETURN(code);
×
1910
  }
1911

1912
  col_id_t colId = pOld->pTags[tag].colId;
217,086✔
1913
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId, true));
217,086✔
1914

1915
  uint32_t nLen = 0;
217,086✔
1916
  for (int32_t i = 0; i < pOld->numOfTags; ++i) {
8,754,594✔
1917
    nLen += (pOld->pTags[i].colId == colId) ? pField->bytes : pOld->pTags[i].bytes;
8,537,508✔
1918
  }
1919

1920
  if (nLen > TSDB_MAX_TAGS_LEN) {
217,086✔
1921
    code = TSDB_CODE_PAR_INVALID_TAGS_LENGTH;
124,713✔
1922
    TAOS_RETURN(code);
124,713✔
1923
  }
1924

1925
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
92,373✔
1926

1927
  SSchema *pTag = pNew->pTags + tag;
92,373✔
1928

1929
  if (!(pTag->type == TSDB_DATA_TYPE_BINARY || pTag->type == TSDB_DATA_TYPE_VARBINARY ||
92,373✔
1930
        pTag->type == TSDB_DATA_TYPE_NCHAR || pTag->type == TSDB_DATA_TYPE_GEOMETRY)) {
90,371✔
1931
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
1932
    TAOS_RETURN(code);
×
1933
  }
1934

1935
  if (pField->bytes <= pTag->bytes) {
92,373✔
1936
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
26,820✔
1937
    TAOS_RETURN(code);
26,820✔
1938
  }
1939

1940
  pTag->bytes = pField->bytes;
65,553✔
1941
  pNew->tagVer++;
65,553✔
1942

1943
  mInfo("stb:%s, start to modify tag len %s to %d", pNew->name, pField->name, pField->bytes);
65,553✔
1944
  TAOS_RETURN(code);
65,553✔
1945
}
1946

1947
static int32_t mndUpdateSuperTableColumnCompress(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, SArray *pField,
58,147✔
1948
                                                 int32_t nCols) {
1949
  // if (pColCmpr == NULL || colName == NULL) return -1;
1950

1951
  if (taosArrayGetSize(pField) != nCols) return TSDB_CODE_FAILED;
58,147✔
1952
  TAOS_FIELD *p = taosArrayGet(pField, 0);
58,147✔
1953

1954
  int32_t code = 0;
58,147✔
1955
  int32_t idx = mndFindSuperTableColumnIndex(pOld, p->name);
58,147✔
1956
  if (idx == -1) {
58,147✔
1957
    code = TSDB_CODE_MND_COLUMN_NOT_EXIST;
×
1958
    TAOS_RETURN(code);
×
1959
  }
1960
  SSchema *pTarget = &pOld->pColumns[idx];
58,147✔
1961
  col_id_t colId = pTarget->colId;
58,147✔
1962

1963
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
58,147✔
1964
  code = validColCmprByType(pTarget->type, p->bytes);
58,147✔
1965
  if (code != TSDB_CODE_SUCCESS) {
58,147✔
1966
    TAOS_RETURN(code);
1,410✔
1967
  }
1968

1969
  int8_t updated = 0;
56,737✔
1970
  for (int i = 0; i < pNew->numOfColumns; i++) {
479,976✔
1971
    SColCmpr *pCmpr = &pNew->pCmpr[i];
479,976✔
1972
    if (pCmpr->id == colId) {
479,976✔
1973
      uint32_t dst = 0;
56,737✔
1974
      updated = tUpdateCompress(pCmpr->alg, p->bytes, TSDB_COLVAL_COMPRESS_DISABLED, TSDB_COLVAL_LEVEL_DISABLED,
56,737✔
1975
                                TSDB_COLVAL_LEVEL_MEDIUM, &dst);
1976
      if (updated > 0) pCmpr->alg = dst;
56,737✔
1977
      break;
56,737✔
1978
    }
1979
  }
1980

1981
  if (updated == 0) {
56,737✔
1982
    code = TSDB_CODE_MND_COLUMN_COMPRESS_ALREADY_EXIST;
5,110✔
1983
    TAOS_RETURN(code);
5,110✔
1984
  } else if (updated == -1) {
51,627✔
1985
    code = TSDB_CODE_TSC_COMPRESS_LEVEL_ERROR;
×
1986
    TAOS_RETURN(code);
×
1987
  }
1988

1989
  pNew->colVer++;
51,627✔
1990

1991
  TAOS_RETURN(code);
51,627✔
1992
}
1993
static int32_t mndAddSuperTableColumn(const SStbObj *pOld, SStbObj *pNew, const SMAlterStbReq* pReq, int32_t ncols,
1,843,015✔
1994
                                      int8_t withCompress) {
1995
  int32_t code = 0;
1,843,015✔
1996
  if (pOld->numOfColumns + ncols + pOld->numOfTags > TSDB_MAX_COLUMNS) {
1,843,015✔
1997
    code = TSDB_CODE_MND_TOO_MANY_COLUMNS;
×
1998
    TAOS_RETURN(code);
×
1999
  }
2000

2001
  if ((code = grantCheck(TSDB_GRANT_TIMESERIES)) != 0) {
1,843,015✔
2002
    TAOS_RETURN(code);
×
2003
  }
2004

2005
  if (!mndValidateSchema(pOld->pColumns, pOld->numOfColumns, pReq->pFields, TSDB_MAX_BYTES_PER_ROW)) {
1,843,015✔
2006
    code = TSDB_CODE_PAR_INVALID_ROW_LENGTH;
×
2007
    TAOS_RETURN(code);
×
2008
  }
2009

2010
  pNew->numOfColumns = pNew->numOfColumns + ncols;
1,843,015✔
2011

2012
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
1,843,015✔
2013

2014
  if (pNew->nextColId < 0 || pNew->nextColId >= 0x7fff - ncols) {
1,843,015✔
2015
    code = TSDB_CODE_OUT_OF_RANGE;
×
2016
    TAOS_RETURN(code);
×
2017
  }
2018

2019
  for (int32_t i = 0; i < ncols; i++) {
3,515,357✔
2020
    if (withCompress) {
1,843,015✔
2021
      SFieldWithOptions *pField = taosArrayGet(pReq->pFields, i);
157,638✔
2022
      if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
157,638✔
2023
        code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
×
2024
        TAOS_RETURN(code);
×
2025
      }
2026

2027
      if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
157,638✔
2028
        code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
×
2029
        TAOS_RETURN(code);
×
2030
      }
2031

2032
      SSchema *pSchema = &pNew->pColumns[pOld->numOfColumns + i];
157,638✔
2033
      pSchema->bytes = pField->bytes;
157,638✔
2034
      pSchema->type = pField->type;
157,638✔
2035
      memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
157,638✔
2036
      pSchema->colId = pNew->nextColId;
157,638✔
2037
      pNew->nextColId++;
157,638✔
2038

2039
      SColCmpr *pCmpr = &pNew->pCmpr[pOld->numOfColumns + i];
157,638✔
2040
      pCmpr->id = pSchema->colId;
157,638✔
2041
      pCmpr->alg = pField->compress;
157,638✔
2042
      mInfo("stb:%s, start to add column %s", pNew->name, pSchema->name);
157,638✔
2043
    } else {
2044
      SField *pField = taosArrayGet(pReq->pFields, i);
1,685,377✔
2045
      if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
1,685,377✔
2046
        code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
169,320✔
2047
        TAOS_RETURN(code);
169,320✔
2048
      }
2049

2050
      if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
1,516,057✔
2051
        code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
1,353✔
2052
        TAOS_RETURN(code);
1,353✔
2053
      }
2054

2055
      SSchema *pSchema = &pNew->pColumns[pOld->numOfColumns + i];
1,514,704✔
2056
      pSchema->bytes = pField->bytes;
1,514,704✔
2057
      pSchema->type = pField->type;
1,514,704✔
2058
      memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
1,514,704✔
2059
      pSchema->colId = pNew->nextColId;
1,514,704✔
2060
      pNew->nextColId++;
1,514,704✔
2061

2062
      SColCmpr *pCmpr = &pNew->pCmpr[pOld->numOfColumns + i];
1,514,704✔
2063
      pCmpr->id = pSchema->colId;
1,514,704✔
2064
      pCmpr->alg = createDefaultColCmprByType(pSchema->type);
1,514,704✔
2065
      mInfo("stb:%s, start to add column %s", pNew->name, pSchema->name);
1,514,704✔
2066
    }
2067
  }
2068
  // 1. old schema already has extschemas
2069
  // 2. new schema has extschemas
2070
  if (pReq->pTypeMods || pOld->pExtSchemas) {
1,672,342✔
2071
    if (!pNew->pExtSchemas) {
1,672,342✔
2072
      // all ext schemas reset to zero
2073
      pNew->pExtSchemas = taosMemoryCalloc(pNew->numOfColumns, sizeof(SExtSchema));
17,404✔
2074
      if (!pNew->pExtSchemas) TAOS_RETURN(terrno);
17,404✔
2075
    }
2076
    if (pOld->pExtSchemas) {
1,672,342✔
2077
      memcpy(pNew->pExtSchemas, pOld->pExtSchemas, pOld->numOfColumns * sizeof(SExtSchema));
1,654,938✔
2078
    }
2079
    if (taosArrayGetSize(pReq->pTypeMods) > 0) {
1,672,342✔
2080
      // copy added column ext schema
2081
      for (int32_t i = 0; i < ncols; ++i) {
3,344,684✔
2082
        pNew->pColumns[pOld->numOfColumns + i].flags |= COL_HAS_TYPE_MOD;
1,672,342✔
2083
        pNew->pExtSchemas[pOld->numOfColumns + i].typeMod = *(STypeMod *)taosArrayGet(pReq->pTypeMods, i);
1,672,342✔
2084
      }
2085
    }
2086
  }
2087

2088
  pNew->colVer++;
1,672,342✔
2089
  TAOS_RETURN(code);
1,672,342✔
2090
}
2091

2092
static int32_t mndDropSuperTableColumn(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const char *colName) {
1,047,806✔
2093
  int32_t code = 0;
1,047,806✔
2094
  int32_t col = mndFindSuperTableColumnIndex(pOld, colName);
1,047,806✔
2095
  if (col < 0) {
1,047,806✔
2096
    code = TSDB_CODE_MND_COLUMN_NOT_EXIST;
1,353✔
2097
    TAOS_RETURN(code);
1,353✔
2098
  }
2099

2100
  if (col == 0) {
1,046,453✔
2101
    code = TSDB_CODE_MND_INVALID_STB_ALTER_OPTION;
980✔
2102
    TAOS_RETURN(code);
980✔
2103
  }
2104

2105
  if (pOld->numOfColumns == 2) {
1,045,473✔
2106
    code = TSDB_CODE_PAR_INVALID_DROP_COL;
×
2107
    TAOS_RETURN(code);
×
2108
  }
2109

2110
  col_id_t colId = pOld->pColumns[col].colId;
1,045,473✔
2111
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId, false));
1,045,473✔
2112

2113
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
1,045,473✔
2114

2115
  int32_t sz = pNew->numOfColumns - col - 1;
1,045,473✔
2116
  memmove(pNew->pColumns + col, pNew->pColumns + col + 1, sizeof(SSchema) * sz);
1,045,473✔
2117
  memmove(pNew->pCmpr + col, pNew->pCmpr + col + 1, sizeof(SColCmpr) * sz);
1,045,473✔
2118
  if (pOld->pExtSchemas) {
1,045,473✔
2119
    memmove(pNew->pExtSchemas + col, pNew->pExtSchemas + col + 1, sizeof(SExtSchema) * sz);
1,038,096✔
2120
  }
2121
  pNew->numOfColumns--;
1,045,473✔
2122

2123
  pNew->colVer++;
1,045,473✔
2124
  mInfo("stb:%s, start to drop col %s", pNew->name, colName);
1,045,473✔
2125
  TAOS_RETURN(code);
1,045,473✔
2126
}
2127

2128
static int32_t mndAlterStbColumnBytes(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const SField *pField) {
342,576✔
2129
  int32_t code = 0;
342,576✔
2130
  int32_t col = mndFindSuperTableColumnIndex(pOld, pField->name);
342,576✔
2131
  if (col < 0) {
342,576✔
2132
    code = TSDB_CODE_MND_COLUMN_NOT_EXIST;
×
2133
    TAOS_RETURN(code);
×
2134
  }
2135

2136
  col_id_t colId = pOld->pColumns[col].colId;
342,576✔
2137

2138
  uint32_t nLen = 0;
342,576✔
2139
  for (int32_t i = 0; i < pOld->numOfColumns; ++i) {
14,147,019✔
2140
    nLen += (pOld->pColumns[i].colId == colId) ? pField->bytes : pOld->pColumns[i].bytes;
13,804,443✔
2141
  }
2142

2143
  if (nLen > TSDB_MAX_BYTES_PER_ROW) {
342,576✔
2144
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
5,364✔
2145
    TAOS_RETURN(code);
5,364✔
2146
  }
2147

2148
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId, false));
337,212✔
2149

2150
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
337,212✔
2151

2152
  SSchema *pCol = pNew->pColumns + col;
337,212✔
2153
  if (!(pCol->type == TSDB_DATA_TYPE_BINARY || pCol->type == TSDB_DATA_TYPE_VARBINARY ||
337,212✔
2154
        pCol->type == TSDB_DATA_TYPE_NCHAR || pCol->type == TSDB_DATA_TYPE_GEOMETRY)) {
333,452✔
2155
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
2156
    TAOS_RETURN(code);
×
2157
  }
2158

2159
  if (pField->bytes <= pCol->bytes) {
337,212✔
2160
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
115,326✔
2161
    TAOS_RETURN(code);
115,326✔
2162
  }
2163

2164
  pCol->bytes = pField->bytes;
221,886✔
2165
  pNew->colVer++;
221,886✔
2166

2167
  mInfo("stb:%s, start to modify col len %s to %d", pNew->name, pField->name, pField->bytes);
221,886✔
2168
  TAOS_RETURN(code);
221,886✔
2169
}
2170

2171
static int32_t mndSetAlterStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
3,220,722✔
2172
  int32_t  code = 0;
3,220,722✔
2173
  SSdbRaw *pRedoRaw = mndStbActionEncode(pStb);
3,220,722✔
2174
  if (pRedoRaw == NULL) {
3,220,722✔
2175
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2176
    if (terrno != 0) code = terrno;
×
2177
    TAOS_RETURN(code);
×
2178
  }
2179
  if ((code = mndTransAppendPrepareLog(pTrans, pRedoRaw)) != 0) {
3,220,722✔
2180
    sdbFreeRaw(pRedoRaw);
×
2181
    TAOS_RETURN(code);
×
2182
  }
2183
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY));
3,220,722✔
2184

2185
  TAOS_RETURN(code);
3,220,722✔
2186
}
2187

2188
static int32_t mndSetAlterStbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
3,220,722✔
2189
  int32_t  code = 0;
3,220,722✔
2190
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
3,220,722✔
2191
  if (pCommitRaw == NULL) {
3,220,722✔
2192
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2193
    if (terrno != 0) code = terrno;
×
2194
    TAOS_RETURN(code);
×
2195
  }
2196
  if ((code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
3,220,722✔
2197
    sdbFreeRaw(pCommitRaw);
×
2198
    TAOS_RETURN(code);
×
2199
  }
2200
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
3,220,722✔
2201

2202
  TAOS_RETURN(code);
3,220,722✔
2203
}
2204

2205
static int32_t mndSetAlterStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb, void *alterOriData,
3,220,722✔
2206
                                         int32_t alterOriDataLen) {
2207
  int32_t code = 0;
3,220,722✔
2208
  SSdb   *pSdb = pMnode->pSdb;
3,220,722✔
2209
  SVgObj *pVgroup = NULL;
3,220,722✔
2210
  void   *pIter = NULL;
3,220,722✔
2211
  int32_t contLen;
3,220,722✔
2212

2213
  while (1) {
7,439,253✔
2214
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
10,659,975✔
2215
    if (pIter == NULL) break;
10,659,975✔
2216
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
7,439,253✔
2217
      sdbRelease(pSdb, pVgroup);
3,034,140✔
2218
      continue;
3,034,140✔
2219
    }
2220

2221
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, alterOriData, alterOriDataLen);
4,405,113✔
2222
    if (pReq == NULL) {
4,405,113✔
2223
      sdbCancelFetch(pSdb, pIter);
×
2224
      sdbRelease(pSdb, pVgroup);
×
2225
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2226
      if (terrno != 0) code = terrno;
×
2227
      TAOS_RETURN(code);
×
2228
    }
2229
    STransAction action = {0};
4,405,113✔
2230
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
4,405,113✔
2231
    action.pCont = pReq;
4,405,113✔
2232
    action.contLen = contLen;
4,405,113✔
2233
    action.msgType = TDMT_VND_ALTER_STB;
4,405,113✔
2234
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
4,405,113✔
2235
      taosMemoryFree(pReq);
×
2236
      sdbCancelFetch(pSdb, pIter);
×
2237
      sdbRelease(pSdb, pVgroup);
×
2238
      TAOS_RETURN(code);
×
2239
    }
2240
    sdbRelease(pSdb, pVgroup);
4,405,113✔
2241
  }
2242

2243
  TAOS_RETURN(code);
3,220,722✔
2244
}
2245

2246
static int32_t mndSetAlterStbRedoActions2(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb,
×
2247
                                          void *alterOriData, int32_t alterOriDataLen) {
2248
  int32_t code = 0;
×
2249
  SSdb   *pSdb = pMnode->pSdb;
×
2250
  SVgObj *pVgroup = NULL;
×
2251
  void   *pIter = NULL;
×
2252
  int32_t contLen;
×
2253

2254
  while (1) {
×
2255
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
×
2256
    if (pIter == NULL) break;
×
2257
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
×
2258
      sdbRelease(pSdb, pVgroup);
×
2259
      continue;
×
2260
    }
2261

2262
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, alterOriData, alterOriDataLen);
×
2263
    if (pReq == NULL) {
×
2264
      sdbCancelFetch(pSdb, pIter);
×
2265
      sdbRelease(pSdb, pVgroup);
×
2266
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2267
      if (terrno != 0) code = terrno;
×
2268
      TAOS_RETURN(code);
×
2269
    }
2270
    STransAction action = {0};
×
2271
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
×
2272
    action.pCont = pReq;
×
2273
    action.contLen = contLen;
×
2274
    action.msgType = TDMT_VND_CREATE_INDEX;
×
2275
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
×
2276
      taosMemoryFree(pReq);
×
2277
      sdbCancelFetch(pSdb, pIter);
×
2278
      sdbRelease(pSdb, pVgroup);
×
2279
      TAOS_RETURN(code);
×
2280
    }
2281
    sdbRelease(pSdb, pVgroup);
×
2282
  }
2283

2284
  TAOS_RETURN(code);
×
2285
}
2286

2287
static int32_t mndBuildStbSchemaImp(SMnode *pMnode, SDbObj *pDb, SStbObj *pStb, const char *tbName, STableMetaRsp *pRsp, bool refByStm) {
13,566,261✔
2288
  int32_t code = 0;
13,566,261✔
2289
  taosRLockLatch(&pStb->lock);
13,566,261✔
2290

2291
  int32_t totalCols = pStb->numOfColumns + pStb->numOfTags;
13,566,261✔
2292
  pRsp->pSchemas = taosMemoryCalloc(totalCols, sizeof(SSchema));
13,566,261✔
2293
  if (pRsp->pSchemas == NULL) {
13,566,261✔
2294
    taosRUnLockLatch(&pStb->lock);
×
2295
    code = terrno;
×
2296
    TAOS_RETURN(code);
×
2297
  }
2298
  pRsp->pSchemaExt = taosMemoryCalloc(pStb->numOfColumns, sizeof(SSchemaExt));
13,566,261✔
2299
  if (pRsp->pSchemaExt == NULL) {
13,566,261✔
2300
    taosRUnLockLatch(&pStb->lock);
×
2301
    code = terrno;
×
2302
    TAOS_RETURN(code);
×
2303
  }
2304
  pRsp->numOfColRefs = 0;
13,566,261✔
2305
  pRsp->pColRefs = NULL;
13,566,261✔
2306
  tstrncpy(pRsp->dbFName, pStb->db, sizeof(pRsp->dbFName));
13,566,261✔
2307
  tstrncpy(pRsp->tbName, tbName, sizeof(pRsp->tbName));
13,566,261✔
2308
  tstrncpy(pRsp->stbName, tbName, sizeof(pRsp->stbName));
13,566,261✔
2309
  pRsp->dbId = pDb->uid;
13,566,261✔
2310
  pRsp->numOfTags = pStb->numOfTags;
13,566,261✔
2311
  pRsp->numOfColumns = pStb->numOfColumns;
13,566,261✔
2312
  pRsp->precision = pDb->cfg.precision;
13,566,261✔
2313
  pRsp->tableType = TSDB_SUPER_TABLE;
13,566,261✔
2314
  pRsp->sversion = pStb->colVer;
13,566,261✔
2315
  pRsp->tversion = pStb->tagVer;
13,566,261✔
2316
  pRsp->suid = pStb->uid;
13,566,261✔
2317
  pRsp->tuid = pStb->uid;
13,566,261✔
2318
  pRsp->virtualStb = pStb->virtualStb;
13,566,261✔
2319

2320
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
366,577,764✔
2321
    SSchema *pSchema = &pRsp->pSchemas[i];
353,011,503✔
2322
    SSchema *pSrcSchema = &pStb->pColumns[i];
353,011,503✔
2323
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
353,011,503✔
2324
    pSchema->type = pSrcSchema->type;
353,011,503✔
2325
    pSchema->flags = pSrcSchema->flags;
353,011,503✔
2326
    pSchema->colId = pSrcSchema->colId;
353,011,503✔
2327
    pSchema->bytes = pSrcSchema->bytes;
353,011,503✔
2328
  }
2329
  
2330
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
65,092,295✔
2331
    SSchema *pSchema = &pRsp->pSchemas[i + pStb->numOfColumns];
51,526,034✔
2332
    SSchema *pSrcSchema = &pStb->pTags[i];
51,526,034✔
2333
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
51,526,034✔
2334
    pSchema->type = pSrcSchema->type;
51,526,034✔
2335
    pSchema->flags = pSrcSchema->flags;
51,526,034✔
2336
    pSchema->colId = pSrcSchema->colId;
51,526,034✔
2337
    pSchema->bytes = pSrcSchema->bytes;
51,526,034✔
2338
  }
2339

2340
  if (refByStm) {
13,566,261✔
2341
    mndStreamUpdateTagsRefFlag(pMnode, pStb->uid, &pRsp->pSchemas[pStb->numOfColumns], pStb->numOfTags);
9,506,903✔
2342
  }
2343

2344
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
366,577,764✔
2345
    SColCmpr   *pCmpr = &pStb->pCmpr[i];
353,011,503✔
2346
    SSchemaExt *pSchEx = &pRsp->pSchemaExt[i];
353,011,503✔
2347
    pSchEx->colId = pCmpr->id;
353,011,503✔
2348
    pSchEx->compress = pCmpr->alg;
353,011,503✔
2349
    if (pStb->pExtSchemas) {
353,011,503✔
2350
      pSchEx->typeMod = pStb->pExtSchemas[i].typeMod;
245,204,712✔
2351
    }
2352
  }
2353

2354
  taosRUnLockLatch(&pStb->lock);
13,566,261✔
2355
  TAOS_RETURN(code);
13,566,261✔
2356
}
2357

2358
static int32_t mndBuildStbCfgImp(SDbObj *pDb, SStbObj *pStb, const char *tbName, STableCfgRsp *pRsp) {
26,822✔
2359
  int32_t code = 0;
26,822✔
2360
  taosRLockLatch(&pStb->lock);
26,822✔
2361

2362
  int32_t totalCols = pStb->numOfColumns + pStb->numOfTags;
26,822✔
2363
  pRsp->pSchemas = taosMemoryCalloc(totalCols, sizeof(SSchema));
26,822✔
2364
  if (pRsp->pSchemas == NULL) {
26,822✔
2365
    taosRUnLockLatch(&pStb->lock);
×
2366
    code = terrno;
×
2367
    TAOS_RETURN(code);
×
2368
  }
2369

2370
  tstrncpy(pRsp->dbFName, pStb->db, sizeof(pRsp->dbFName));
26,822✔
2371
  tstrncpy(pRsp->tbName, tbName, sizeof(pRsp->tbName));
26,822✔
2372
  tstrncpy(pRsp->stbName, tbName, sizeof(pRsp->stbName));
26,822✔
2373
  pRsp->numOfTags = pStb->numOfTags;
26,822✔
2374
  pRsp->numOfColumns = pStb->numOfColumns;
26,822✔
2375
  pRsp->tableType = TSDB_SUPER_TABLE;
26,822✔
2376
  pRsp->delay1 = pStb->maxdelay[0];
26,822✔
2377
  pRsp->delay2 = pStb->maxdelay[1];
26,822✔
2378
  pRsp->watermark1 = pStb->watermark[0];
26,822✔
2379
  pRsp->watermark2 = pStb->watermark[1];
26,822✔
2380
  pRsp->ttl = pStb->ttl;
26,822✔
2381
  pRsp->keep = pStb->keep;
26,822✔
2382
  pRsp->commentLen = pStb->commentLen;
26,822✔
2383
  if (pStb->commentLen > 0) {
26,822✔
2384
    pRsp->pComment = taosStrdup(pStb->comment);
×
2385
  }
2386

2387
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
230,890✔
2388
    SSchema *pSchema = &pRsp->pSchemas[i];
204,068✔
2389
    SSchema *pSrcSchema = &pStb->pColumns[i];
204,068✔
2390
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
204,068✔
2391
    pSchema->type = pSrcSchema->type;
204,068✔
2392
    pSchema->flags = pSrcSchema->flags;
204,068✔
2393
    pSchema->colId = pSrcSchema->colId;
204,068✔
2394
    pSchema->bytes = pSrcSchema->bytes;
204,068✔
2395
  }
2396

2397
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
147,813✔
2398
    SSchema *pSchema = &pRsp->pSchemas[i + pStb->numOfColumns];
120,991✔
2399
    SSchema *pSrcSchema = &pStb->pTags[i];
120,991✔
2400
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
120,991✔
2401
    pSchema->type = pSrcSchema->type;
120,991✔
2402
    pSchema->flags = pSrcSchema->flags;
120,991✔
2403
    pSchema->colId = pSrcSchema->colId;
120,991✔
2404
    pSchema->bytes = pSrcSchema->bytes;
120,991✔
2405
  }
2406

2407
  if (pStb->numOfFuncs > 0) {
26,822✔
2408
    pRsp->pFuncs = taosArrayDup(pStb->pFuncs, NULL);
×
2409
  }
2410

2411
  pRsp->pSchemaExt = taosMemoryCalloc(pStb->numOfColumns, sizeof(SSchemaExt));
26,822✔
2412
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
230,890✔
2413
    SColCmpr *pCmpr = &pStb->pCmpr[i];
204,068✔
2414

2415
    SSchemaExt *pSchExt = &pRsp->pSchemaExt[i];
204,068✔
2416
    pSchExt->colId = pCmpr->id;
204,068✔
2417
    pSchExt->compress = pCmpr->alg;
204,068✔
2418
    if (pStb->pExtSchemas) {
204,068✔
2419
      pSchExt->typeMod = pStb->pExtSchemas[i].typeMod;
17,314✔
2420
    }
2421
  }
2422
  pRsp->virtualStb = pStb->virtualStb;
26,822✔
2423
  pRsp->pColRefs = NULL;
26,822✔
2424

2425
  taosRUnLockLatch(&pStb->lock);
26,822✔
2426
  TAOS_RETURN(code);
26,822✔
2427
}
2428

2429
static int32_t mndValidateStbVersion(SMnode *pMnode, SSTableVersion *pStbVer, bool *schema, bool *sma) {
1,523,519✔
2430
  int32_t code = 0;
1,523,519✔
2431
  char    tbFName[TSDB_TABLE_FNAME_LEN] = {0};
1,523,519✔
2432
  snprintf(tbFName, sizeof(tbFName), "%s.%s", pStbVer->dbFName, pStbVer->stbName);
1,523,519✔
2433

2434
  SDbObj *pDb = mndAcquireDb(pMnode, pStbVer->dbFName);
1,523,519✔
2435
  if (pDb == NULL) {
1,523,519✔
2436
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
10,965✔
2437
    TAOS_RETURN(code);
10,965✔
2438
  }
2439

2440
  if (pDb->uid != pStbVer->dbId) {
1,512,554✔
2441
    mndReleaseDb(pMnode, pDb);
1,512✔
2442
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
1,512✔
2443
    TAOS_RETURN(code);
1,512✔
2444
  }
2445

2446
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
1,511,042✔
2447
  if (pStb == NULL) {
1,511,042✔
2448
    mndReleaseDb(pMnode, pDb);
857✔
2449
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
857✔
2450
    TAOS_RETURN(code);
857✔
2451
  }
2452

2453
  taosRLockLatch(&pStb->lock);
1,510,185✔
2454

2455
  if (pStbVer->sversion != pStb->colVer || pStbVer->tversion != pStb->tagVer) {
1,510,185✔
2456
    *schema = true;
15,246✔
2457
  } else {
2458
    *schema = false;
1,494,939✔
2459
  }
2460

2461
  if (pStbVer->smaVer && pStbVer->smaVer != pStb->smaVer) {
1,510,185✔
2462
    *sma = true;
×
2463
  } else {
2464
    *sma = false;
1,510,185✔
2465
  }
2466

2467
  taosRUnLockLatch(&pStb->lock);
1,510,185✔
2468

2469
  mndReleaseDb(pMnode, pDb);
1,510,185✔
2470
  mndReleaseStb(pMnode, pStb);
1,510,185✔
2471
  return TSDB_CODE_SUCCESS;
1,510,185✔
2472
}
2473

2474
static int32_t mndBuildStbSchema(SMnode *pMnode, const char *dbFName, const char *tbName, STableMetaRsp *pRsp, bool refByStm) {
9,942,377✔
2475
  int32_t code = 0;
9,942,377✔
2476
  char    tbFName[TSDB_TABLE_FNAME_LEN] = {0};
9,942,377✔
2477
  snprintf(tbFName, sizeof(tbFName), "%s.%s", dbFName, tbName);
9,942,377✔
2478

2479
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
9,942,377✔
2480
  if (pDb == NULL) {
9,942,377✔
2481
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
2482
    TAOS_RETURN(code);
×
2483
  }
2484

2485
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
9,942,377✔
2486
  if (pStb == NULL) {
9,942,377✔
2487
    mndReleaseDb(pMnode, pDb);
420,228✔
2488
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
420,228✔
2489
    TAOS_RETURN(code);
420,228✔
2490
  }
2491

2492
  code = mndBuildStbSchemaImp(pMnode, pDb, pStb, tbName, pRsp, refByStm);
9,522,149✔
2493
  mndReleaseDb(pMnode, pDb);
9,522,149✔
2494
  mndReleaseStb(pMnode, pStb);
9,522,149✔
2495
  TAOS_RETURN(code);
9,522,149✔
2496
}
2497

2498
static int32_t mndBuildStbCfg(SMnode *pMnode, const char *dbFName, const char *tbName, STableCfgRsp *pRsp) {
26,822✔
2499
  int32_t code = 0;
26,822✔
2500
  char    tbFName[TSDB_TABLE_FNAME_LEN] = {0};
26,822✔
2501
  snprintf(tbFName, sizeof(tbFName), "%s.%s", dbFName, tbName);
26,822✔
2502

2503
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
26,822✔
2504
  if (pDb == NULL) {
26,822✔
2505
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
2506
    TAOS_RETURN(code);
×
2507
  }
2508

2509
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
26,822✔
2510
  if (pStb == NULL) {
26,822✔
2511
    mndReleaseDb(pMnode, pDb);
×
2512
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
×
2513
    TAOS_RETURN(code);
×
2514
  }
2515

2516
  code = mndBuildStbCfgImp(pDb, pStb, tbName, pRsp);
26,822✔
2517

2518
  mndReleaseDb(pMnode, pDb);
26,822✔
2519
  mndReleaseStb(pMnode, pStb);
26,822✔
2520
  TAOS_RETURN(code);
26,822✔
2521
}
2522

2523
static int32_t mndBuildSMAlterStbRsp(SDbObj *pDb, SStbObj *pObj, void **pCont, int32_t *pLen) {
3,199,069✔
2524
  int32_t       code = 0;
3,199,069✔
2525
  SEncoder      ec = {0};
3,199,069✔
2526
  uint32_t      contLen = 0;
3,199,069✔
2527
  SMAlterStbRsp alterRsp = {0};
3,199,069✔
2528
  SName         name = {0};
3,199,069✔
2529
  TAOS_CHECK_RETURN(tNameFromString(&name, pObj->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
3,199,069✔
2530

2531
  alterRsp.pMeta = taosMemoryCalloc(1, sizeof(STableMetaRsp));
3,199,069✔
2532
  if (NULL == alterRsp.pMeta) {
3,199,069✔
2533
    code = terrno;
×
2534
    TAOS_RETURN(code);
×
2535
  }
2536

2537
  code = mndBuildStbSchemaImp(NULL, pDb, pObj, name.tname, alterRsp.pMeta, false);
3,199,069✔
2538
  if (code) {
3,199,069✔
2539
    tFreeSMAlterStbRsp(&alterRsp);
×
2540
    return code;
×
2541
  }
2542

2543
  tEncodeSize(tEncodeSMAlterStbRsp, &alterRsp, contLen, code);
3,199,069✔
2544
  if (code) {
3,199,069✔
2545
    tFreeSMAlterStbRsp(&alterRsp);
×
2546
    return code;
×
2547
  }
2548

2549
  void *cont = taosMemoryMalloc(contLen);
3,199,069✔
2550
  if (NULL == cont) {
3,199,069✔
2551
    code = terrno;
×
2552
    tFreeSMAlterStbRsp(&alterRsp);
×
2553
    TAOS_RETURN(code);
×
2554
  }
2555
  tEncoderInit(&ec, cont, contLen);
3,199,069✔
2556
  code = tEncodeSMAlterStbRsp(&ec, &alterRsp);
3,199,069✔
2557
  tEncoderClear(&ec);
3,199,069✔
2558

2559
  tFreeSMAlterStbRsp(&alterRsp);
3,199,069✔
2560

2561
  if (code < 0) TAOS_RETURN(code);
3,199,069✔
2562

2563
  *pCont = cont;
3,199,069✔
2564
  *pLen = contLen;
3,199,069✔
2565

2566
  TAOS_RETURN(code);
3,199,069✔
2567
}
2568

2569
int32_t mndBuildSMCreateStbRsp(SMnode *pMnode, char *dbFName, char *stbFName, void **pCont, int32_t *pLen) {
846,121✔
2570
  int32_t code = -1;
846,121✔
2571
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
846,121✔
2572
  if (NULL == pDb) {
846,121✔
2573
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2574
    if (terrno != 0) code = terrno;
×
2575
    TAOS_RETURN(code);
×
2576
  }
2577

2578
  SStbObj *pObj = mndAcquireStb(pMnode, stbFName);
846,121✔
2579
  if (NULL == pObj) {
846,121✔
2580
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
1,078✔
2581
    if (terrno != 0) code = terrno;
1,078✔
2582
    goto _OVER;
1,078✔
2583
  }
2584

2585
  SEncoder       ec = {0};
845,043✔
2586
  uint32_t       contLen = 0;
845,043✔
2587
  SMCreateStbRsp stbRsp = {0};
845,043✔
2588
  SName          name = {0};
845,043✔
2589
  TAOS_CHECK_GOTO(tNameFromString(&name, pObj->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE), NULL, _OVER);
845,043✔
2590

2591
  stbRsp.pMeta = taosMemoryCalloc(1, sizeof(STableMetaRsp));
845,043✔
2592
  if (NULL == stbRsp.pMeta) {
845,043✔
2593
    code = terrno;
×
2594
    goto _OVER;
×
2595
  }
2596

2597
  code = mndBuildStbSchemaImp(NULL, pDb, pObj, name.tname, stbRsp.pMeta, false);
845,043✔
2598
  if (code) {
845,043✔
2599
    tFreeSMCreateStbRsp(&stbRsp);
×
2600
    goto _OVER;
×
2601
  }
2602

2603
  tEncodeSize(tEncodeSMCreateStbRsp, &stbRsp, contLen, code);
845,043✔
2604
  if (code) {
845,043✔
2605
    tFreeSMCreateStbRsp(&stbRsp);
×
2606
    goto _OVER;
×
2607
  }
2608

2609
  void *cont = taosMemoryMalloc(contLen);
845,043✔
2610
  if (NULL == cont) {
845,043✔
2611
    code = terrno;
×
2612
    tFreeSMCreateStbRsp(&stbRsp);
×
2613
    goto _OVER;
×
2614
  }
2615
  tEncoderInit(&ec, cont, contLen);
845,043✔
2616
  TAOS_CHECK_GOTO(tEncodeSMCreateStbRsp(&ec, &stbRsp), NULL, _OVER);
845,043✔
2617
  tEncoderClear(&ec);
845,043✔
2618

2619
  tFreeSMCreateStbRsp(&stbRsp);
845,043✔
2620

2621
  *pCont = cont;
845,043✔
2622
  *pLen = contLen;
845,043✔
2623

2624
  code = 0;
845,043✔
2625

2626
_OVER:
846,121✔
2627
  if (pObj) {
846,121✔
2628
    mndReleaseStb(pMnode, pObj);
845,043✔
2629
  }
2630

2631
  if (pDb) {
846,121✔
2632
    mndReleaseDb(pMnode, pDb);
846,121✔
2633
  }
2634

2635
  TAOS_RETURN(code);
846,121✔
2636
}
2637

2638
static int32_t mndAlterStbImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
3,211,412✔
2639
                              void *alterOriData, int32_t alterOriDataLen) {
2640
  int32_t code = -1;
3,211,412✔
2641
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "alter-stb");
3,211,412✔
2642
  if (pTrans == NULL) {
3,211,412✔
2643
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2644
    if (terrno != 0) code = terrno;
×
2645
    goto _OVER;
×
2646
  }
2647

2648
  mInfo("trans:%d, used to alter stb:%s, alterOriDataLen:%d", pTrans->id, pStb->name, alterOriDataLen);
3,211,412✔
2649
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
3,211,412✔
2650
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
3,211,412✔
2651

2652
  if (needRsp) {
3,029,930✔
2653
    void   *pCont = NULL;
3,008,277✔
2654
    int32_t contLen = 0;
3,008,277✔
2655
    TAOS_CHECK_GOTO(mndBuildSMAlterStbRsp(pDb, pStb, &pCont, &contLen), NULL, _OVER);
3,008,277✔
2656
    mndTransSetRpcRsp(pTrans, pCont, contLen);
3,008,277✔
2657
  }
2658

2659
  TAOS_CHECK_GOTO(mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
3,029,930✔
2660
  TAOS_CHECK_GOTO(mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
3,029,930✔
2661
  TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
3,029,930✔
2662
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
3,029,930✔
2663

2664
  code = 0;
3,029,930✔
2665

2666
_OVER:
3,211,412✔
2667
  mndTransDrop(pTrans);
3,211,412✔
2668
  TAOS_RETURN(code);
3,211,412✔
2669
}
2670

2671
static int32_t mndAlterStbAndUpdateTagIdxImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
190,792✔
2672
                                             void *alterOriData, int32_t alterOriDataLen, const SMAlterStbReq *pAlter) {
2673
  int32_t code = -1;
190,792✔
2674
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "alter-stb");
190,792✔
2675
  if (pTrans == NULL) {
190,792✔
2676
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2677
    if (terrno != 0) code = terrno;
×
2678
    goto _OVER;
×
2679
  }
2680

2681
  mInfo("trans:%d, used to alter stb:%s", pTrans->id, pStb->name);
190,792✔
2682
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
190,792✔
2683

2684
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
190,792✔
2685

2686
  if (needRsp) {
190,792✔
2687
    void   *pCont = NULL;
190,792✔
2688
    int32_t contLen = 0;
190,792✔
2689
    TAOS_CHECK_GOTO(mndBuildSMAlterStbRsp(pDb, pStb, &pCont, &contLen), NULL, _OVER);
190,792✔
2690
    mndTransSetRpcRsp(pTrans, pCont, contLen);
190,792✔
2691
  }
2692

2693
  if (pAlter->alterType == TSDB_ALTER_TABLE_DROP_TAG) {
190,792✔
2694
    SIdxObj idxObj = {0};
79,703✔
2695
    SField *pField0 = taosArrayGet(pAlter->pFields, 0);
79,703✔
2696
    bool    exist = false;
79,703✔
2697
    if (mndGetIdxsByTagName(pMnode, pStb, pField0->name, &idxObj) == 0) {
79,703✔
2698
      exist = true;
1,781✔
2699
    }
2700
    TAOS_CHECK_GOTO(mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
79,703✔
2701
    TAOS_CHECK_GOTO(mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
79,703✔
2702

2703
    if (exist == true) {
79,703✔
2704
      TAOS_CHECK_GOTO(mndSetDropIdxPrepareLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
1,781✔
2705
      TAOS_CHECK_GOTO(mndSetDropIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
1,781✔
2706
    }
2707

2708
    TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
79,703✔
2709
    TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
79,703✔
2710

2711
  } else if (pAlter->alterType == TSDB_ALTER_TABLE_UPDATE_TAG_NAME) {
111,089✔
2712
    SIdxObj     idxObj = {0};
111,089✔
2713
    SField     *pField0 = taosArrayGet(pAlter->pFields, 0);
111,089✔
2714
    SField     *pField1 = taosArrayGet(pAlter->pFields, 1);
111,089✔
2715
    const char *oTagName = pField0->name;
111,089✔
2716
    const char *nTagName = pField1->name;
111,089✔
2717
    bool        exist = false;
111,089✔
2718

2719
    if (mndGetIdxsByTagName(pMnode, pStb, pField0->name, &idxObj) == 0) {
111,089✔
2720
      exist = true;
8,798✔
2721
    }
2722

2723
    TAOS_CHECK_GOTO(mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
111,089✔
2724
    TAOS_CHECK_GOTO(mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
111,089✔
2725

2726
    if (exist == true) {
111,089✔
2727
      memcpy(idxObj.colName, nTagName, strlen(nTagName));
8,798✔
2728
      idxObj.colName[strlen(nTagName)] = 0;
8,798✔
2729
      TAOS_CHECK_GOTO(mndSetAlterIdxPrepareLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
8,798✔
2730
      TAOS_CHECK_GOTO(mndSetAlterIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
8,798✔
2731
    }
2732

2733
    TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
111,089✔
2734
    TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
111,089✔
2735
  }
2736
  code = 0;
190,792✔
2737

2738
_OVER:
190,792✔
2739
  mndTransDrop(pTrans);
190,792✔
2740
  TAOS_RETURN(code);
190,792✔
2741
}
2742

2743
static int32_t mndAlterStb(SMnode *pMnode, SRpcMsg *pReq, const SMAlterStbReq *pAlter, SDbObj *pDb, SStbObj *pOld) {
3,913,334✔
2744
  bool    needRsp = true;
3,913,334✔
2745
  int32_t code = -1;
3,913,334✔
2746
  SField *pField0 = NULL;
3,913,334✔
2747

2748
  SStbObj stbObj = {0};
3,913,334✔
2749
  taosRLockLatch(&pOld->lock);
3,913,334✔
2750
  memcpy(&stbObj, pOld, sizeof(SStbObj));
3,913,334✔
2751
  taosRUnLockLatch(&pOld->lock);
3,913,334✔
2752
  stbObj.pColumns = NULL;
3,913,334✔
2753
  stbObj.pTags = NULL;
3,913,334✔
2754
  stbObj.pFuncs = NULL;
3,913,334✔
2755
  stbObj.pCmpr = NULL;
3,913,334✔
2756
  stbObj.pExtSchemas = NULL;
3,913,334✔
2757
  stbObj.updateTime = taosGetTimestampMs();
3,913,334✔
2758
  stbObj.lock = 0;
3,913,334✔
2759
  stbObj.virtualStb = pOld->virtualStb;
3,913,334✔
2760
  bool updateTagIndex = false;
3,913,334✔
2761
  switch (pAlter->alterType) {
3,913,334✔
2762
    case TSDB_ALTER_TABLE_ADD_TAG:
192,796✔
2763
      code = mndAddSuperTableTag(pOld, &stbObj, pAlter->pFields, pAlter->numOfFields);
192,796✔
2764
      break;
192,796✔
2765
    case TSDB_ALTER_TABLE_DROP_TAG:
79,703✔
2766
      pField0 = taosArrayGet(pAlter->pFields, 0);
79,703✔
2767
      code = mndDropSuperTableTag(pMnode, pOld, &stbObj, pField0->name);
79,703✔
2768
      updateTagIndex = true;
79,703✔
2769
      break;
79,703✔
2770
    case TSDB_ALTER_TABLE_UPDATE_TAG_NAME:
117,354✔
2771
      code = mndAlterStbTagName(pMnode, pOld, &stbObj, pAlter->pFields);
117,354✔
2772
      updateTagIndex = true;
117,354✔
2773
      break;
117,354✔
2774
    case TSDB_ALTER_TABLE_UPDATE_TAG_BYTES:
217,086✔
2775
      pField0 = taosArrayGet(pAlter->pFields, 0);
217,086✔
2776
      code = mndAlterStbTagBytes(pMnode, pOld, &stbObj, pField0);
217,086✔
2777
      break;
217,086✔
2778
    case TSDB_ALTER_TABLE_ADD_COLUMN:
1,685,377✔
2779
      code = mndAddSuperTableColumn(pOld, &stbObj, pAlter, pAlter->numOfFields, 0);
1,685,377✔
2780
      break;
1,685,377✔
2781
    case TSDB_ALTER_TABLE_DROP_COLUMN:
1,047,806✔
2782
      pField0 = taosArrayGet(pAlter->pFields, 0);
1,047,806✔
2783
      code = mndDropSuperTableColumn(pMnode, pOld, &stbObj, pField0->name);
1,047,806✔
2784
      break;
1,047,806✔
2785
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES:
342,576✔
2786
      pField0 = taosArrayGet(pAlter->pFields, 0);
342,576✔
2787
      code = mndAlterStbColumnBytes(pMnode, pOld, &stbObj, pField0);
342,576✔
2788
      break;
342,576✔
2789
    case TSDB_ALTER_TABLE_UPDATE_OPTIONS:
14,851✔
2790
      needRsp = false;
14,851✔
2791
      code = mndUpdateTableOptions(pOld, &stbObj, pAlter->comment, pAlter->commentLen, pAlter->ttl, pAlter->keep);
14,851✔
2792
      break;
14,851✔
2793
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_COMPRESS:
58,147✔
2794
      code = mndUpdateSuperTableColumnCompress(pMnode, pOld, &stbObj, pAlter->pFields, pAlter->numOfFields);
58,147✔
2795
      break;
58,147✔
2796
    case TSDB_ALTER_TABLE_ADD_COLUMN_WITH_COMPRESS_OPTION:
157,638✔
2797
      code = mndAddSuperTableColumn(pOld, &stbObj, pAlter, pAlter->numOfFields, 1);
157,638✔
2798
      break;
157,638✔
2799
    default:
×
2800
      needRsp = false;
×
2801
      terrno = TSDB_CODE_OPS_NOT_SUPPORT;
×
2802
      break;
×
2803
  }
2804

2805
  if (code != 0) goto _OVER;
3,913,334✔
2806
  if (updateTagIndex == false) {
3,395,402✔
2807
    code = mndAlterStbImp(pMnode, pReq, pDb, &stbObj, needRsp, pReq->pCont, pReq->contLen);
3,204,610✔
2808
  } else {
2809
    code = mndAlterStbAndUpdateTagIdxImp(pMnode, pReq, pDb, &stbObj, needRsp, pReq->pCont, pReq->contLen, pAlter);
190,792✔
2810
  }
2811

2812
_OVER:
3,913,334✔
2813
  taosMemoryFreeClear(stbObj.pTags);
3,913,334✔
2814
  taosMemoryFreeClear(stbObj.pColumns);
3,913,334✔
2815
  taosMemoryFreeClear(stbObj.pCmpr);
3,913,334✔
2816
  if (pAlter->commentLen > 0) {
3,913,334✔
2817
    taosMemoryFreeClear(stbObj.comment);
3,024✔
2818
  }
2819
  taosMemoryFreeClear(stbObj.pExtSchemas);
3,913,334✔
2820
  TAOS_RETURN(code);
3,913,334✔
2821
}
2822

2823
static int32_t mndProcessAlterStbReq(SRpcMsg *pReq) {
3,923,495✔
2824
  SMnode       *pMnode = pReq->info.node;
3,923,495✔
2825
  int32_t       code = -1;
3,923,495✔
2826
  SDbObj       *pDb = NULL;
3,923,495✔
2827
  SStbObj      *pStb = NULL;
3,923,495✔
2828
  SMAlterStbReq alterReq = {0};
3,923,495✔
2829

2830
  if (tDeserializeSMAlterStbReq(pReq->pCont, pReq->contLen, &alterReq) != 0) {
3,923,495✔
2831
    code = TSDB_CODE_INVALID_MSG;
×
2832
    goto _OVER;
×
2833
  }
2834

2835
  mInfo("stb:%s, start to alter", alterReq.name);
3,923,495✔
2836
  if (mndCheckAlterStbReq(&alterReq) != 0) goto _OVER;
3,923,495✔
2837

2838
  pDb = mndAcquireDbByStb(pMnode, alterReq.name);
3,923,495✔
2839
  if (pDb == NULL) {
3,923,495✔
2840
    code = TSDB_CODE_MND_DB_NOT_EXIST;
×
2841
    goto _OVER;
×
2842
  }
2843
  if (pDb->cfg.isMount) {
3,923,495✔
2844
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
327✔
2845
    goto _OVER;
327✔
2846
  }
2847

2848
  pStb = mndAcquireStb(pMnode, alterReq.name);
3,923,168✔
2849
  if (pStb == NULL) {
3,923,168✔
2850
    code = TSDB_CODE_MND_STB_NOT_EXIST;
9,834✔
2851
    goto _OVER;
9,834✔
2852
  }
2853

2854
  if ((code = mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_WRITE_DB, pDb)) != 0) {
3,913,334✔
2855
    goto _OVER;
×
2856
  }
2857

2858
  code = mndAlterStb(pMnode, pReq, &alterReq, pDb, pStb);
3,913,334✔
2859
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
3,913,334✔
2860

2861
  SName   name = {0};
3,913,334✔
2862
  int32_t ret = 0;
3,913,334✔
2863
  if ((ret = tNameFromString(&name, alterReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0)
3,913,334✔
2864
    mError("stb:%s, failed to tNameFromString since %s", alterReq.name, tstrerror(ret));
×
2865

2866
  auditRecord(pReq, pMnode->clusterId, "alterStb", name.dbname, name.tname, alterReq.sql, alterReq.sqlLen);
3,913,334✔
2867

2868
_OVER:
3,923,495✔
2869
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
3,923,495✔
2870
    mError("stb:%s, failed to alter since %s", alterReq.name, tstrerror(code));
709,575✔
2871
  }
2872

2873
  mndReleaseStb(pMnode, pStb);
3,923,495✔
2874
  mndReleaseDb(pMnode, pDb);
3,923,495✔
2875
  tFreeSMAltertbReq(&alterReq);
3,923,495✔
2876

2877
  TAOS_RETURN(code);
3,923,495✔
2878
}
2879

2880
static int32_t mndSetDropStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SStbObj *pStb) {
273,197✔
2881
  int32_t  code = 0;
273,197✔
2882
  SSdbRaw *pRedoRaw = mndStbActionEncode(pStb);
273,197✔
2883
  if (pRedoRaw == NULL) {
273,197✔
2884
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2885
    if (terrno != 0) code = terrno;
×
2886
    TAOS_RETURN(code);
×
2887
  }
2888
  if ((code = mndTransAppendPrepareLog(pTrans, pRedoRaw)) != 0) {
273,197✔
2889
    sdbFreeRaw(pRedoRaw);
×
2890
    TAOS_RETURN(code);
×
2891
  }
2892
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_DROPPING));
273,197✔
2893

2894
  TAOS_RETURN(code);
273,197✔
2895
}
2896

2897
static int32_t mndSetDropStbCommitLogs(SMnode *pMnode, STrans *pTrans, SStbObj *pStb) {
273,197✔
2898
  int32_t  code = 0;
273,197✔
2899
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
273,197✔
2900
  if (pCommitRaw == NULL) {
273,197✔
2901
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2902
    if (terrno != 0) code = terrno;
×
2903
    TAOS_RETURN(code);
×
2904
  }
2905
  if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
273,197✔
2906
    sdbFreeRaw(pCommitRaw);
×
2907
    TAOS_RETURN(code);
×
2908
  }
2909
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED));
273,197✔
2910

2911
  TAOS_RETURN(code);
273,197✔
2912
}
2913

2914
static int32_t mndSetDropStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
273,197✔
2915
  int32_t code = 0;
273,197✔
2916
  SSdb   *pSdb = pMnode->pSdb;
273,197✔
2917
  SVgObj *pVgroup = NULL;
273,197✔
2918
  void   *pIter = NULL;
273,197✔
2919

2920
  while (1) {
702,950✔
2921
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
976,147✔
2922
    if (pIter == NULL) break;
976,147✔
2923
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
702,950✔
2924
      sdbRelease(pSdb, pVgroup);
155,563✔
2925
      continue;
155,563✔
2926
    }
2927

2928
    int32_t contLen = 0;
547,387✔
2929
    void   *pReq = mndBuildVDropStbReq(pMnode, pVgroup, pStb, &contLen);
547,387✔
2930
    if (pReq == NULL) {
547,387✔
2931
      sdbCancelFetch(pSdb, pIter);
×
2932
      sdbRelease(pSdb, pVgroup);
×
2933
      code = TSDB_CODE_OUT_OF_MEMORY;
×
2934
      TAOS_RETURN(code);
×
2935
    }
2936

2937
    STransAction action = {0};
547,387✔
2938
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
547,387✔
2939
    action.pCont = pReq;
547,387✔
2940
    action.contLen = contLen;
547,387✔
2941
    action.msgType = TDMT_VND_DROP_STB;
547,387✔
2942
    action.acceptableCode = TSDB_CODE_TDB_STB_NOT_EXIST;
547,387✔
2943
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
547,387✔
2944
      taosMemoryFree(pReq);
×
2945
      sdbCancelFetch(pSdb, pIter);
×
2946
      sdbRelease(pSdb, pVgroup);
×
2947
      TAOS_RETURN(code);
×
2948
    }
2949
    sdbRelease(pSdb, pVgroup);
547,387✔
2950
  }
2951

2952
  TAOS_RETURN(code);
273,197✔
2953
}
2954

2955
static int32_t mndDropStb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb) {
273,197✔
2956
  int32_t code = -1;
273,197✔
2957
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "drop-stb");
273,197✔
2958
  if (pTrans == NULL) {
273,197✔
2959
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2960
    if (terrno != 0) code = terrno;
×
2961
    goto _OVER;
×
2962
  }
2963

2964
  mInfo("trans:%d, used to drop stb:%s", pTrans->id, pStb->name);
273,197✔
2965
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
273,197✔
2966
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
273,197✔
2967

2968
  TAOS_CHECK_GOTO(mndSetDropStbPrepareLogs(pMnode, pTrans, pStb), NULL, _OVER);
273,197✔
2969
  TAOS_CHECK_GOTO(mndSetDropStbCommitLogs(pMnode, pTrans, pStb), NULL, _OVER);
273,197✔
2970
  TAOS_CHECK_GOTO(mndSetDropStbRedoActions(pMnode, pTrans, pDb, pStb), NULL, _OVER);
273,197✔
2971
  TAOS_CHECK_GOTO(mndDropIdxsByStb(pMnode, pTrans, pDb, pStb), NULL, _OVER);
273,197✔
2972
  TAOS_CHECK_GOTO(mndDropRsmaByStb(pMnode, pTrans, pDb, pStb), NULL, _OVER);
273,197✔
2973
  TAOS_CHECK_GOTO(mndUserRemoveStb(pMnode, pTrans, pStb->name), NULL, _OVER);
273,197✔
2974
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
273,197✔
2975
  code = 0;
273,197✔
2976

2977
_OVER:
273,197✔
2978
  mndTransDrop(pTrans);
273,197✔
2979
  TAOS_RETURN(code);
273,197✔
2980
}
2981

2982
static int32_t mndCheckDropStbForTopic(SMnode *pMnode, const char *stbFullName, int64_t suid) {
273,524✔
2983
  int32_t code = 0;
273,524✔
2984
  SSdb   *pSdb = pMnode->pSdb;
273,524✔
2985
  void   *pIter = NULL;
273,524✔
2986
  while (1) {
×
2987
    SMqTopicObj *pTopic = NULL;
273,524✔
2988
    pIter = sdbFetch(pSdb, SDB_TOPIC, pIter, (void **)&pTopic);
273,524✔
2989
    if (pIter == NULL) break;
273,524✔
2990

2991
    if (pTopic->subType == TOPIC_SUB_TYPE__TABLE) {
×
2992
      if (pTopic->stbUid == suid) {
×
2993
        sdbRelease(pSdb, pTopic);
×
2994
        sdbCancelFetch(pSdb, pIter);
×
2995
        TAOS_RETURN(-1);
×
2996
      }
2997
    }
2998

2999
    if (pTopic->ast == NULL) {
×
3000
      sdbRelease(pSdb, pTopic);
×
3001
      continue;
×
3002
    }
3003

3004
    SNode *pAst = NULL;
×
3005
    if (nodesStringToNode(pTopic->ast, &pAst) != 0) {
×
3006
      code = TSDB_CODE_MND_INVALID_TOPIC_OPTION;
×
3007
      mError("topic:%s, create ast error", pTopic->name);
×
3008
      sdbRelease(pSdb, pTopic);
×
3009
      sdbCancelFetch(pSdb, pIter);
×
3010
      TAOS_RETURN(code);
×
3011
    }
3012

3013
    SNodeList *pNodeList = NULL;
×
3014
    if ((code = nodesCollectColumns((SSelectStmt *)pAst, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pNodeList)) !=
×
3015
        0) {
3016
      sdbRelease(pSdb, pTopic);
×
3017
      sdbCancelFetch(pSdb, pIter);
×
3018
      TAOS_RETURN(code);
×
3019
    }
3020
    SNode *pNode = NULL;
×
3021
    FOREACH(pNode, pNodeList) {
×
3022
      SColumnNode *pCol = (SColumnNode *)pNode;
×
3023

3024
      if (pCol->tableId == suid) {
×
3025
        sdbRelease(pSdb, pTopic);
×
3026
        nodesDestroyNode(pAst);
×
3027
        nodesDestroyList(pNodeList);
×
3028
        sdbCancelFetch(pSdb, pIter);
×
3029
        TAOS_RETURN(-1);
×
3030
      } else {
3031
        goto NEXT;
×
3032
      }
3033
    }
3034
  NEXT:
×
3035
    sdbRelease(pSdb, pTopic);
×
3036
    nodesDestroyNode(pAst);
×
3037
    nodesDestroyList(pNodeList);
×
3038
  }
3039
  TAOS_RETURN(code);
273,524✔
3040
}
3041

3042
static int32_t mndCheckDropStbForStream(SMnode *pMnode, const char *stbFullName, int64_t suid) {
×
3043
  int32_t code = 0;
×
3044
  SSdb   *pSdb = pMnode->pSdb;
×
3045
  void   *pIter = NULL;
×
3046
  while (1) {
×
3047
    SStreamObj *pStream = NULL;
×
3048
    pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
×
3049
    if (pIter == NULL) break;
×
3050

3051
    if (pStream->pCreate->outStbUid == suid) {
×
3052
      sdbCancelFetch(pSdb, pIter);
×
3053
      sdbRelease(pSdb, pStream);
×
3054
      TAOS_RETURN(-1);
×
3055
    }
3056

3057
    sdbRelease(pSdb, pStream);
×
3058
  }
3059
  TAOS_RETURN(code);
×
3060
}
3061

3062
static int32_t mndProcessDropTtltbRsp(SRpcMsg *pRsp) { return 0; }
×
3063
static int32_t mndProcessTrimDbRsp(SRpcMsg *pRsp) { return 0; }
×
3064
static int32_t mndProcessTrimDbWalRsp(SRpcMsg *pRsp) { return 0; }
644✔
3065
static int32_t mndProcessS3MigrateDbRsp(SRpcMsg *pRsp) { return 0; }
×
3066

3067
static int32_t mndProcessDropStbReq(SRpcMsg *pReq) {
468,506✔
3068
  SMnode      *pMnode = pReq->info.node;
468,506✔
3069
  int32_t      code = -1;
468,506✔
3070
  SDbObj      *pDb = NULL;
468,506✔
3071
  SStbObj     *pStb = NULL;
468,506✔
3072
  SMDropStbReq dropReq = {0};
468,506✔
3073

3074
  TAOS_CHECK_GOTO(tDeserializeSMDropStbReq(pReq->pCont, pReq->contLen, &dropReq), NULL, _OVER);
468,506✔
3075

3076
  mInfo("stb:%s, start to drop", dropReq.name);
468,506✔
3077

3078
  pStb = mndAcquireStb(pMnode, dropReq.name);
468,506✔
3079
  if (pStb == NULL) {
468,506✔
3080
    if (dropReq.igNotExists) {
194,982✔
3081
      mInfo("stb:%s, not exist, ignore not exist is set", dropReq.name);
194,531✔
3082
      code = 0;
194,531✔
3083
      goto _OVER;
194,531✔
3084
    } else {
3085
      code = TSDB_CODE_MND_STB_NOT_EXIST;
451✔
3086
      goto _OVER;
451✔
3087
    }
3088
  }
3089

3090
  if ((dropReq.source == TD_REQ_FROM_TAOX_OLD || dropReq.source == TD_REQ_FROM_TAOX) && pStb->uid != dropReq.suid) {
273,524✔
3091
    code = 0;
×
3092
    goto _OVER;
×
3093
  }
3094

3095
  pDb = mndAcquireDbByStb(pMnode, dropReq.name);
273,524✔
3096
  if (pDb == NULL) {
273,524✔
3097
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
3098
    goto _OVER;
×
3099
  }
3100

3101
  if ((code = mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_WRITE_DB, pDb)) != 0) {
273,524✔
3102
    goto _OVER;
×
3103
  }
3104

3105
  if (mndCheckDropStbForTopic(pMnode, dropReq.name, pStb->uid) < 0) {
273,524✔
3106
    code = TSDB_CODE_MND_TOPIC_MUST_BE_DELETED;
×
3107
    goto _OVER;
×
3108
  }
3109

3110
/*
3111
  if (mndCheckDropStbForStream(pMnode, dropReq.name, pStb->uid) < 0) {
3112
    code = TSDB_CODE_MND_STREAM_MUST_BE_DELETED;
3113
    goto _OVER;
3114
  }
3115
*/
3116

3117
  if (pDb->cfg.isMount) {
273,524✔
3118
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
327✔
3119
    goto _OVER;
327✔
3120
  }
3121

3122
  code = mndDropStb(pMnode, pReq, pDb, pStb);
273,197✔
3123
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
273,197✔
3124

3125
  SName   name = {0};
273,197✔
3126
  int32_t ret = 0;
273,197✔
3127
  if ((ret = tNameFromString(&name, dropReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0)
273,197✔
3128
    mError("stb:%s, failed to tNameFromString since %s", dropReq.name, tstrerror(ret));
×
3129

3130
  auditRecord(pReq, pMnode->clusterId, "dropStb", name.dbname, name.tname, dropReq.sql, dropReq.sqlLen);
273,197✔
3131

3132
_OVER:
468,506✔
3133
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
468,506✔
3134
    mError("stb:%s, failed to drop since %s", dropReq.name, tstrerror(code));
778✔
3135
  }
3136

3137
  mndReleaseDb(pMnode, pDb);
468,506✔
3138
  mndReleaseStb(pMnode, pStb);
468,506✔
3139
  tFreeSMDropStbReq(&dropReq);
468,506✔
3140
  TAOS_RETURN(code);
468,506✔
3141
}
3142

3143
static int32_t mndProcessTableMetaReq(SRpcMsg *pReq) {
11,086,467✔
3144
  SMnode       *pMnode = pReq->info.node;
11,086,467✔
3145
  int32_t       code = -1;
11,086,467✔
3146
  STableInfoReq infoReq = {0};
11,086,467✔
3147
  STableMetaRsp metaRsp = {0};
11,086,467✔
3148
  SUserObj     *pUser = NULL;
11,086,467✔
3149

3150
  code = mndAcquireUser(pMnode, pReq->info.conn.user, &pUser);
11,086,467✔
3151
  if (pUser == NULL) return 0;
11,086,467✔
3152
  bool sysinfo = pUser->sysInfo;
11,086,467✔
3153

3154
  TAOS_CHECK_GOTO(tDeserializeSTableInfoReq(pReq->pCont, pReq->contLen, &infoReq), NULL, _OVER);
11,086,467✔
3155

3156
  if (0 == strcmp(infoReq.dbFName, TSDB_INFORMATION_SCHEMA_DB)) {
11,086,467✔
3157
    mInfo("information_schema table:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
1,085,702✔
3158
    TAOS_CHECK_GOTO(mndBuildInsTableSchema(pMnode, infoReq.dbFName, infoReq.tbName, sysinfo, &metaRsp), NULL, _OVER);
1,085,702✔
3159
  } else if (0 == strcmp(infoReq.dbFName, TSDB_PERFORMANCE_SCHEMA_DB)) {
10,000,765✔
3160
    mInfo("performance_schema table:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
73,634✔
3161
    TAOS_CHECK_GOTO(mndBuildPerfsTableSchema(pMnode, infoReq.dbFName, infoReq.tbName, &metaRsp), NULL, _OVER);
73,634✔
3162
  } else {
3163
    mInfo("stb:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
9,927,131✔
3164
    TAOS_CHECK_GOTO(mndBuildStbSchema(pMnode, infoReq.dbFName, infoReq.tbName, &metaRsp, true), NULL, _OVER);
9,927,131✔
3165
  }
3166

3167
  int32_t rspLen = tSerializeSTableMetaRsp(NULL, 0, &metaRsp);
10,553,183✔
3168
  if (rspLen < 0) {
10,553,183✔
3169
    code = TSDB_CODE_INVALID_MSG;
×
3170
    goto _OVER;
×
3171
  }
3172

3173
  void *pRsp = rpcMallocCont(rspLen);
10,553,183✔
3174
  if (pRsp == NULL) {
10,553,183✔
3175
    code = terrno;
×
3176
    goto _OVER;
×
3177
  }
3178

3179
  if ((rspLen = tSerializeSTableMetaRsp(pRsp, rspLen, &metaRsp)) < 0) {
10,553,183✔
3180
    code = rspLen;
×
3181
    goto _OVER;
×
3182
  }
3183
  pReq->info.rsp = pRsp;
10,553,183✔
3184
  pReq->info.rspLen = rspLen;
10,553,183✔
3185
  code = 0;
10,553,183✔
3186

3187
  mTrace("%s.%s, meta is retrieved", infoReq.dbFName, infoReq.tbName);
10,553,183✔
3188

3189
_OVER:
11,086,467✔
3190
  if (code != 0) {
11,086,467✔
3191
    mError("stb:%s.%s, failed to retrieve meta since %s", infoReq.dbFName, infoReq.tbName, tstrerror(code));
533,284✔
3192
  }
3193

3194
  mndReleaseUser(pMnode, pUser);
11,086,467✔
3195
  tFreeSTableMetaRsp(&metaRsp);
11,086,467✔
3196
  // TODO change to TAOS_RETURN
3197
  return code;
11,086,467✔
3198
}
3199

3200
static int32_t mndProcessTableCfgReq(SRpcMsg *pReq) {
33,092✔
3201
  SMnode      *pMnode = pReq->info.node;
33,092✔
3202
  int32_t      code = -1;
33,092✔
3203
  STableCfgReq cfgReq = {0};
33,092✔
3204
  STableCfgRsp cfgRsp = {0};
33,092✔
3205

3206
  TAOS_CHECK_GOTO(tDeserializeSTableCfgReq(pReq->pCont, pReq->contLen, &cfgReq), NULL, _OVER);
33,092✔
3207

3208
  char dbName[TSDB_DB_NAME_LEN] = {0};
33,092✔
3209
  TAOS_CHECK_GOTO(mndExtractShortDbNameFromDbFullName(cfgReq.dbFName, dbName), NULL, _OVER);
33,092✔
3210
  if (0 == strcmp(dbName, TSDB_INFORMATION_SCHEMA_DB)) {
33,092✔
3211
    mInfo("information_schema table:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
4,180✔
3212
    TAOS_CHECK_GOTO(mndBuildInsTableCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
4,180✔
3213
  } else if (0 == strcmp(dbName, TSDB_PERFORMANCE_SCHEMA_DB)) {
28,912✔
3214
    mInfo("performance_schema table:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
2,090✔
3215
    TAOS_CHECK_GOTO(mndBuildPerfsTableCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
2,090✔
3216
  } else {
3217
    mInfo("stb:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
26,822✔
3218
    TAOS_CHECK_GOTO(mndBuildStbCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
26,822✔
3219
  }
3220

3221
  int32_t rspLen = tSerializeSTableCfgRsp(NULL, 0, &cfgRsp);
33,092✔
3222
  if (rspLen < 0) {
33,092✔
3223
    code = TSDB_CODE_INVALID_MSG;
×
3224
    goto _OVER;
×
3225
  }
3226

3227
  void *pRsp = rpcMallocCont(rspLen);
33,092✔
3228
  if (pRsp == NULL) {
33,092✔
3229
    code = terrno;
×
3230
    goto _OVER;
×
3231
  }
3232

3233
  if ((rspLen = tSerializeSTableCfgRsp(pRsp, rspLen, &cfgRsp)) < 0) {
33,092✔
3234
    code = rspLen;
×
3235
    goto _OVER;
×
3236
  }
3237
  pReq->info.rsp = pRsp;
33,092✔
3238
  pReq->info.rspLen = rspLen;
33,092✔
3239
  code = 0;
33,092✔
3240

3241
  mTrace("%s.%s, cfg is retrieved", cfgReq.dbFName, cfgReq.tbName);
33,092✔
3242

3243
_OVER:
33,092✔
3244
  if (code != 0) {
33,092✔
3245
    mError("stb:%s.%s, failed to retrieve cfg since %s", cfgReq.dbFName, cfgReq.tbName, tstrerror(code));
×
3246
  }
3247

3248
  tFreeSTableCfgRsp(&cfgRsp);
33,092✔
3249
  TAOS_RETURN(code);
33,092✔
3250
}
3251

3252
int32_t mndValidateStbInfo(SMnode *pMnode, SSTableVersion *pStbVersions, int32_t numOfStbs, void **ppRsp,
1,241,250✔
3253
                           int32_t *pRspLen) {
3254
  int32_t   code = 0;
1,241,250✔
3255
  SSTbHbRsp hbRsp = {0};
1,241,250✔
3256
  hbRsp.pMetaRsp = taosArrayInit(numOfStbs, sizeof(STableMetaRsp));
1,241,250✔
3257
  if (hbRsp.pMetaRsp == NULL) {
1,241,250✔
3258
    code = terrno;
×
3259
    TAOS_RETURN(code);
×
3260
  }
3261

3262
  hbRsp.pIndexRsp = taosArrayInit(numOfStbs, sizeof(STableIndexRsp));
1,241,250✔
3263
  if (NULL == hbRsp.pIndexRsp) {
1,241,250✔
3264
    taosArrayDestroy(hbRsp.pMetaRsp);
×
3265
    code = terrno;
×
3266
    TAOS_RETURN(code);
×
3267
  }
3268

3269
  for (int32_t i = 0; i < numOfStbs; ++i) {
2,764,769✔
3270
    SSTableVersion *pStbVersion = &pStbVersions[i];
1,523,519✔
3271
    pStbVersion->suid = be64toh(pStbVersion->suid);
1,523,519✔
3272
    pStbVersion->sversion = ntohl(pStbVersion->sversion);
1,523,519✔
3273
    pStbVersion->tversion = ntohl(pStbVersion->tversion);
1,523,519✔
3274
    pStbVersion->smaVer = ntohl(pStbVersion->smaVer);
1,523,519✔
3275

3276
    bool    schema = false;
1,523,519✔
3277
    bool    sma = false;
1,523,519✔
3278
    int32_t code = mndValidateStbVersion(pMnode, pStbVersion, &schema, &sma);
1,523,519✔
3279
    if (TSDB_CODE_SUCCESS != code) {
1,523,519✔
3280
      STableMetaRsp metaRsp = {0};
13,334✔
3281
      metaRsp.numOfColumns = -1;
13,334✔
3282
      metaRsp.suid = pStbVersion->suid;
13,334✔
3283
      tstrncpy(metaRsp.dbFName, pStbVersion->dbFName, sizeof(metaRsp.dbFName));
13,334✔
3284
      tstrncpy(metaRsp.tbName, pStbVersion->stbName, sizeof(metaRsp.tbName));
13,334✔
3285
      tstrncpy(metaRsp.stbName, pStbVersion->stbName, sizeof(metaRsp.stbName));
13,334✔
3286
      if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
26,668✔
3287
        code = terrno;
×
3288
        return code;
×
3289
      }
3290
      continue;
13,334✔
3291
    }
3292

3293
    if (schema) {
1,510,185✔
3294
      STableMetaRsp metaRsp = {0};
15,246✔
3295
      mInfo("stb:%s.%s, start to retrieve meta", pStbVersion->dbFName, pStbVersion->stbName);
15,246✔
3296
      if (mndBuildStbSchema(pMnode, pStbVersion->dbFName, pStbVersion->stbName, &metaRsp, false) != 0) {
15,246✔
3297
        metaRsp.numOfColumns = -1;
×
3298
        metaRsp.suid = pStbVersion->suid;
×
3299
        tstrncpy(metaRsp.dbFName, pStbVersion->dbFName, sizeof(metaRsp.dbFName));
×
3300
        tstrncpy(metaRsp.tbName, pStbVersion->stbName, sizeof(metaRsp.tbName));
×
3301
        tstrncpy(metaRsp.stbName, pStbVersion->stbName, sizeof(metaRsp.stbName));
×
3302
        if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
×
3303
          code = terrno;
×
3304
          return code;
×
3305
        }
3306
        continue;
×
3307
      }
3308

3309
      if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
30,492✔
3310
        code = terrno;
×
3311
        return code;
×
3312
      }
3313
    }
3314

3315
    if (sma) {
1,510,185✔
3316
      bool           exist = false;
×
3317
      char           tbFName[TSDB_TABLE_FNAME_LEN];
×
3318
      STableIndexRsp indexRsp = {0};
×
3319
      indexRsp.pIndex = taosArrayInit(10, sizeof(STableIndexInfo));
×
3320
      if (NULL == indexRsp.pIndex) {
×
3321
        code = terrno;
×
3322
        TAOS_RETURN(code);
×
3323
      }
3324

3325
      (void)tsnprintf(tbFName, sizeof(tbFName), "%s.%s", pStbVersion->dbFName, pStbVersion->stbName);
×
3326
      tstrncpy(indexRsp.dbFName, pStbVersion->dbFName, sizeof(indexRsp.dbFName));
×
3327
      tstrncpy(indexRsp.tbName, pStbVersion->stbName, sizeof(indexRsp.tbName));
×
3328

3329
      if (taosArrayPush(hbRsp.pIndexRsp, &indexRsp) == NULL) {
×
3330
        code = terrno;
×
3331
        return code;
×
3332
      }
3333
    }
3334
  }
3335

3336
  int32_t rspLen = tSerializeSSTbHbRsp(NULL, 0, &hbRsp);
1,241,250✔
3337
  if (rspLen < 0) {
1,241,250✔
3338
    tFreeSSTbHbRsp(&hbRsp);
×
3339
    code = TSDB_CODE_INVALID_MSG;
×
3340
    TAOS_RETURN(code);
×
3341
  }
3342

3343
  void *pRsp = taosMemoryMalloc(rspLen);
1,241,250✔
3344
  if (pRsp == NULL) {
1,241,250✔
3345
    tFreeSSTbHbRsp(&hbRsp);
×
3346
    code = terrno;
×
3347
    TAOS_RETURN(code);
×
3348
  }
3349

3350
  rspLen = tSerializeSSTbHbRsp(pRsp, rspLen, &hbRsp);
1,241,250✔
3351
  tFreeSSTbHbRsp(&hbRsp);
1,241,250✔
3352
  if (rspLen < 0) return rspLen;
1,241,250✔
3353
  *ppRsp = pRsp;
1,241,250✔
3354
  *pRspLen = rspLen;
1,241,250✔
3355
  TAOS_RETURN(code);
1,241,250✔
3356
}
3357

3358
int32_t mndGetNumOfStbs(SMnode *pMnode, char *dbName, int32_t *pNumOfStbs) {
850,657✔
3359
  int32_t code = 0;
850,657✔
3360
  SSdb   *pSdb = pMnode->pSdb;
850,657✔
3361
  SDbObj *pDb = mndAcquireDb(pMnode, dbName);
850,657✔
3362
  if (pDb == NULL) {
850,657✔
3363
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
3364
    TAOS_RETURN(code);
×
3365
  }
3366

3367
  int32_t numOfStbs = 0;
850,657✔
3368
  void   *pIter = NULL;
850,657✔
3369
  while (1) {
5,823,878✔
3370
    SStbObj *pStb = NULL;
6,674,535✔
3371
    pIter = sdbFetch(pSdb, SDB_STB, pIter, (void **)&pStb);
6,674,535✔
3372
    if (pIter == NULL) break;
6,674,535✔
3373

3374
    if (pStb->dbUid == pDb->uid) {
5,823,878✔
3375
      numOfStbs++;
5,203,848✔
3376
    }
3377

3378
    sdbRelease(pSdb, pStb);
5,823,878✔
3379
  }
3380

3381
  *pNumOfStbs = numOfStbs;
850,657✔
3382
  mndReleaseDb(pMnode, pDb);
850,657✔
3383
  TAOS_RETURN(code);
850,657✔
3384
}
3385

3386
int32_t mndExtractDbNameFromStbFullName(const char *stbFullName, char *dst) {
×
3387
  SName name = {0};
×
3388
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
×
3389

3390
  TAOS_CHECK_RETURN(tNameGetFullDbName(&name, dst));
×
3391

3392
  return 0;
×
3393
}
3394

3395
int32_t mndExtractShortDbNameFromStbFullName(const char *stbFullName, char *dst) {
50,119✔
3396
  SName name = {0};
50,119✔
3397
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
50,119✔
3398

3399
  TAOS_CHECK_RETURN(tNameGetDbName(&name, dst));
50,119✔
3400

3401
  return 0;
50,119✔
3402
}
3403

3404
int32_t mndExtractShortDbNameFromDbFullName(const char *stbFullName, char *dst) {
33,092✔
3405
  SName name = {0};
33,092✔
3406
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB));
33,092✔
3407

3408
  TAOS_CHECK_RETURN(tNameGetDbName(&name, dst));
33,092✔
3409

3410
  return 0;
33,092✔
3411
}
3412

3413
void mndExtractTbNameFromStbFullName(const char *stbFullName, char *dst, int32_t dstSize) {
596,217✔
3414
  int32_t pos = -1;
596,217✔
3415
  int32_t num = 0;
596,217✔
3416
  for (pos = 0; stbFullName[pos] != 0; ++pos) {
5,484,015✔
3417
    if (stbFullName[pos] == TS_PATH_DELIMITER[0]) num++;
5,484,015✔
3418
    if (num == 2) break;
5,484,015✔
3419
  }
3420

3421
  if (num == 2) {
596,217✔
3422
    tstrncpy(dst, stbFullName + pos + 1, dstSize);
596,217✔
3423
  }
3424
}
596,217✔
3425

3426
static int32_t mndRetrieveStb(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
165,902✔
3427
  SMnode   *pMnode = pReq->info.node;
165,902✔
3428
  SSdb     *pSdb = pMnode->pSdb;
165,902✔
3429
  int32_t   numOfRows = 0;
165,902✔
3430
  SStbObj  *pStb = NULL;
165,902✔
3431
  SUserObj *pUser = NULL;
165,902✔
3432
  int32_t   cols = 0;
165,902✔
3433
  int32_t   lino = 0;
165,902✔
3434
  int32_t   code = 0;
165,902✔
3435

3436
  SDbObj *pDb = NULL;
165,902✔
3437
  if (strlen(pShow->db) > 0) {
165,902✔
3438
    pDb = mndAcquireDb(pMnode, pShow->db);
133,944✔
3439
    if (pDb == NULL) return terrno;
133,944✔
3440
  }
3441

3442
  if ((code = mndAcquireUser(pMnode, pReq->info.conn.user, &pUser)) != 0) {
165,363✔
3443
    goto _ERROR;
×
3444
  }
3445

3446
  while (numOfRows < rows) {
1,078,606✔
3447
    pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb);
1,078,576✔
3448
    if (pShow->pIter == NULL) break;
1,078,576✔
3449

3450
    if (pDb != NULL && pStb->dbUid != pDb->uid) {
913,243✔
3451
      sdbRelease(pSdb, pStb);
526,062✔
3452
      continue;
526,062✔
3453
    }
3454

3455
    if (isTsmaResSTb(pStb->name)) {
387,181✔
3456
      sdbRelease(pSdb, pStb);
×
3457
      continue;
×
3458
    }
3459

3460
    if ((0 == pUser->superUser) && mndCheckStbPrivilege(pMnode, pUser, MND_OPER_SHOW_STB, pStb) != 0) {
387,181✔
3461
      sdbRelease(pSdb, pStb);
2,199✔
3462
      terrno = 0;
2,199✔
3463
      continue;
2,199✔
3464
    }
3465

3466
    cols = 0;
384,982✔
3467

3468
    SName name = {0};
384,982✔
3469

3470
    char stbName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
384,982✔
3471
    mndExtractTbNameFromStbFullName(pStb->name, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN);
384,982✔
3472
    varDataSetLen(stbName, strlen(&stbName[VARSTR_HEADER_SIZE]));
384,982✔
3473
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
384,982✔
3474
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stbName, false), pStb, &lino, _ERROR);
384,982✔
3475

3476
    char db[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
384,982✔
3477
    RETRIEVE_CHECK_GOTO(tNameFromString(&name, pStb->db, T_NAME_ACCT | T_NAME_DB), pStb, &lino, _ERROR);
384,982✔
3478
    RETRIEVE_CHECK_GOTO(tNameGetDbName(&name, varDataVal(db)), pStb, &lino, _ERROR);
384,982✔
3479
    varDataSetLen(db, strlen(varDataVal(db)));
384,982✔
3480
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
384,982✔
3481
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)db, false), pStb, &lino, _ERROR);
384,982✔
3482

3483
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
384,982✔
3484
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->createdTime, false), pStb, &lino,
384,982✔
3485
                        _ERROR);
3486

3487
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
384,982✔
3488
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->numOfColumns, false), pStb, &lino,
384,982✔
3489
                        _ERROR);
3490

3491
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
384,982✔
3492
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->numOfTags, false), pStb, &lino, _ERROR);
384,982✔
3493

3494
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
384,982✔
3495
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->updateTime, false), pStb, &lino,
384,982✔
3496
                        _ERROR);  // number of tables
3497

3498
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
384,982✔
3499
    if (pStb->commentLen > 0) {
384,982✔
3500
      char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
8,834✔
3501
      STR_TO_VARSTR(comment, pStb->comment);
8,834✔
3502
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, comment, false), pStb, &lino, _ERROR);
8,834✔
3503
    } else if (pStb->commentLen == 0) {
376,148✔
3504
      char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
8,034✔
3505
      STR_TO_VARSTR(comment, "");
8,034✔
3506
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, comment, false), pStb, &lino, _ERROR);
8,034✔
3507
    } else {
3508
      colDataSetNULL(pColInfo, numOfRows);
368,114✔
3509
    }
3510

3511
    char watermark[64 + VARSTR_HEADER_SIZE] = {0};
384,982✔
3512
    (void)tsnprintf(varDataVal(watermark), sizeof(watermark) - VARSTR_HEADER_SIZE, "%" PRId64 "a,%" PRId64 "a",
769,964✔
3513
              pStb->watermark[0], pStb->watermark[1]);
769,964✔
3514
    varDataSetLen(watermark, strlen(varDataVal(watermark)));
384,982✔
3515

3516
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
384,982✔
3517
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)watermark, false), pStb, &lino, _ERROR);
384,982✔
3518

3519
    char maxDelay[64 + VARSTR_HEADER_SIZE] = {0};
384,982✔
3520
    (void)tsnprintf(varDataVal(maxDelay), sizeof(maxDelay) - VARSTR_HEADER_SIZE, "%" PRId64 "a,%" PRId64 "a",
769,964✔
3521
              pStb->maxdelay[0], pStb->maxdelay[1]);
769,964✔
3522
    varDataSetLen(maxDelay, strlen(varDataVal(maxDelay)));
384,982✔
3523

3524
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
384,982✔
3525
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)maxDelay, false), pStb, &lino, _ERROR);
384,982✔
3526

3527
    char    rollup[160 + VARSTR_HEADER_SIZE] = {0};
384,982✔
3528
    int32_t rollupNum = (int32_t)taosArrayGetSize(pStb->pFuncs);
384,982✔
3529
    char   *sep = ", ";
384,982✔
3530
    int32_t sepLen = strlen(sep);
384,982✔
3531
    int32_t rollupLen = sizeof(rollup) - VARSTR_HEADER_SIZE - 2;
384,982✔
3532
    for (int32_t i = 0; i < rollupNum; ++i) {
384,982✔
3533
      char *funcName = taosArrayGet(pStb->pFuncs, i);
×
3534
      if (i) {
×
3535
        (void)strncat(varDataVal(rollup), sep, rollupLen);
×
3536
        rollupLen -= sepLen;
×
3537
      }
3538
      (void)strncat(varDataVal(rollup), funcName, rollupLen);
×
3539
      rollupLen -= strlen(funcName);
×
3540
    }
3541
    varDataSetLen(rollup, strlen(varDataVal(rollup)));
384,982✔
3542

3543
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
384,982✔
3544
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)rollup, false), pStb, &lino, _ERROR);
384,982✔
3545

3546
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
384,982✔
3547
    if (pColInfo) {
384,982✔
3548
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->uid), false), pStb, &lino, _ERROR);
384,982✔
3549
    }
3550

3551
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
384,982✔
3552
    if (pColInfo) {
384,982✔
3553
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->virtualStb), false), pStb, &lino, _ERROR);
384,982✔
3554
    }
3555

3556
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
384,982✔
3557
    if (pColInfo) {
384,982✔
3558
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->keep), false), pStb, &lino, _ERROR);
384,982✔
3559
    }
3560

3561
    numOfRows++;
384,982✔
3562
    sdbRelease(pSdb, pStb);
384,982✔
3563
  }
3564

3565
  if (pDb != NULL) {
165,363✔
3566
    mndReleaseDb(pMnode, pDb);
133,405✔
3567
  }
3568
  if (pUser != NULL) {
165,363✔
3569
    mndReleaseUser(pMnode, pUser);
165,363✔
3570
  }
3571

3572
  goto _OVER;
165,363✔
3573

3574
_ERROR:
×
3575
  if (pDb != NULL) {
×
3576
    mndReleaseDb(pMnode, pDb);
×
3577
  }
3578
  if (pUser != NULL) {
×
3579
    mndReleaseUser(pMnode, pUser);
×
3580
  }
3581
  mError("show:0x%" PRIx64 ", failed to retrieve data at %s:%d since %s", pShow->id, __FUNCTION__, lino,
×
3582
         tstrerror(code));
3583

3584
_OVER:
165,363✔
3585
  pShow->numOfRows += numOfRows;
165,363✔
3586
  return numOfRows;
165,363✔
3587
}
3588

3589
static int32_t buildDbColsInfoBlock(const SSDataBlock *p, const SSysTableMeta *pSysDbTableMeta, size_t size,
484,918✔
3590
                                    const char *dbName, const char *tbName) {
3591
  char    tName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
484,918✔
3592
  char    dName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
484,918✔
3593
  char    typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
484,918✔
3594
  int32_t numOfRows = p->info.rows;
484,918✔
3595
  int32_t lino = 0;
484,918✔
3596
  int32_t code = 0;
484,918✔
3597

3598
  STR_TO_VARSTR(dName, dbName);
484,918✔
3599
  STR_TO_VARSTR(typeName, "SYSTEM_TABLE");
484,918✔
3600

3601
  for (int32_t i = 0; i < size; ++i) {
13,820,163✔
3602
    const SSysTableMeta *pm = &pSysDbTableMeta[i];
13,335,245✔
3603
    //    if (pm->sysInfo) {
3604
    //      continue;
3605
    //    }
3606
    if (tbName[0] && strncmp(tbName, pm->name, TSDB_TABLE_NAME_LEN) != 0) {
13,335,153✔
3607
      continue;
×
3608
    }
3609

3610
    STR_TO_VARSTR(tName, pm->name);
13,335,245✔
3611

3612
    for (int32_t j = 0; j < pm->colNum; j++) {
129,470,806✔
3613
      // table name
3614
      SColumnInfoData *pColInfoData = taosArrayGet(p->pDataBlock, 0);
116,133,077✔
3615
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, tName, false), &lino, _OVER);
116,131,053✔
3616

3617
      // database name
3618
      pColInfoData = taosArrayGet(p->pDataBlock, 1);
116,132,433✔
3619
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, dName, false), &lino, _OVER);
116,131,605✔
3620

3621
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
116,131,697✔
3622
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, typeName, false), &lino, _OVER);
116,129,397✔
3623

3624
      // col name
3625
      char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
116,131,973✔
3626
      STR_TO_VARSTR(colName, pm->schema[j].name);
116,131,789✔
3627
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
116,127,925✔
3628
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, colName, false), &lino, _OVER);
116,130,685✔
3629

3630
      // col type
3631
      int8_t colType = pm->schema[j].type;
116,132,341✔
3632
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
116,132,341✔
3633
      char colTypeStr[VARSTR_HEADER_SIZE + 32];
116,130,593✔
3634
      int  colTypeLen =
116,129,673✔
3635
          tsnprintf(varDataVal(colTypeStr), sizeof(colTypeStr) - VARSTR_HEADER_SIZE, "%s", tDataTypes[colType].name);
116,130,777✔
3636
      if (colType == TSDB_DATA_TYPE_VARCHAR) {
116,129,673✔
3637
        colTypeLen +=
57,697,882✔
3638
            tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d)",
57,702,298✔
3639
                      (int32_t)(pm->schema[j].bytes - VARSTR_HEADER_SIZE));
57,701,378✔
3640
      } else if (colType == TSDB_DATA_TYPE_NCHAR) {
58,428,295✔
3641
        colTypeLen +=
×
3642
            tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d)",
×
3643
                      (int32_t)((pm->schema[j].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
×
3644
      }
3645
      varDataSetLen(colTypeStr, colTypeLen);
116,126,177✔
3646
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, (char *)colTypeStr, false), &lino, _OVER);
116,119,093✔
3647

3648
      // col length
3649
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
116,133,721✔
3650
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, (const char *)&pm->schema[j].bytes, false), &lino, _OVER);
116,131,973✔
3651

3652
      // col precision, col scale, col nullable, col source
3653
      for (int32_t k = 6; k <= 10; ++k) {
696,558,342✔
3654
        pColInfoData = taosArrayGet(p->pDataBlock, k);
580,371,721✔
3655
        colDataSetNULL(pColInfoData, numOfRows);
580,348,997✔
3656
      }
3657

3658
      numOfRows += 1;
116,186,621✔
3659
    }
3660
  }
3661
  return numOfRows;
484,918✔
3662
_OVER:
×
3663
  mError("failed at %s:%d since %s", __FUNCTION__, lino, tstrerror(code));
×
3664
  return numOfRows;
×
3665
}
3666
#define BUILD_COL_FOR_INFO_DB 1
3667
#define BUILD_COL_FOR_PERF_DB 1 << 1
3668
#define BUILD_COL_FOR_USER_DB 1 << 2
3669
#define BUILD_COL_FOR_ALL_DB  (BUILD_COL_FOR_INFO_DB | BUILD_COL_FOR_PERF_DB | BUILD_COL_FOR_USER_DB)
3670

3671
static int32_t buildSysDbColsInfo(SSDataBlock *p, int8_t buildWhichDBs, char *tb) {
263,679✔
3672
  size_t               size = 0;
263,679✔
3673
  const SSysTableMeta *pSysDbTableMeta = NULL;
263,679✔
3674

3675
  if (buildWhichDBs & BUILD_COL_FOR_INFO_DB) {
263,679✔
3676
    getInfosDbMeta(&pSysDbTableMeta, &size);
242,459✔
3677
    p->info.rows = buildDbColsInfoBlock(p, pSysDbTableMeta, size, TSDB_INFORMATION_SCHEMA_DB, tb);
242,459✔
3678
  }
3679

3680
  if (buildWhichDBs & BUILD_COL_FOR_PERF_DB) {
263,679✔
3681
    getPerfDbMeta(&pSysDbTableMeta, &size);
242,459✔
3682
    p->info.rows = buildDbColsInfoBlock(p, pSysDbTableMeta, size, TSDB_PERFORMANCE_SCHEMA_DB, tb);
242,459✔
3683
  }
3684

3685
  return p->info.rows;
263,679✔
3686
}
3687

3688
static int8_t determineBuildColForWhichDBs(const char *db) {
263,919✔
3689
  int8_t buildWhichDBs;
3690
  if (!db[0])
263,919✔
3691
    buildWhichDBs = BUILD_COL_FOR_ALL_DB;
242,449✔
3692
  else {
3693
    char *p = strchr(db, '.');
21,470✔
3694
    if (p && strcmp(p + 1, TSDB_INFORMATION_SCHEMA_DB) == 0) {
21,470✔
3695
      buildWhichDBs = BUILD_COL_FOR_INFO_DB;
10✔
3696
    } else if (p && strcmp(p + 1, TSDB_PERFORMANCE_SCHEMA_DB) == 0) {
21,460✔
3697
      buildWhichDBs = BUILD_COL_FOR_PERF_DB;
10✔
3698
    } else {
3699
      buildWhichDBs = BUILD_COL_FOR_USER_DB;
21,450✔
3700
    }
3701
  }
3702
  return buildWhichDBs;
263,919✔
3703
}
3704

3705
static int32_t mndRetrieveStbCol(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
263,919✔
3706
  uint8_t  buildWhichDBs;
3707
  SMnode  *pMnode = pReq->info.node;
263,919✔
3708
  SSdb    *pSdb = pMnode->pSdb;
263,919✔
3709
  SStbObj *pStb = NULL;
263,919✔
3710
  int32_t  numOfRows = 0;
263,919✔
3711
  int32_t  lino = 0;
263,919✔
3712
  int32_t  code = 0;
263,919✔
3713

3714
  buildWhichDBs = determineBuildColForWhichDBs(pShow->db);
263,919✔
3715

3716
  if (!pShow->sysDbRsp) {
263,919✔
3717
    numOfRows = buildSysDbColsInfo(pBlock, buildWhichDBs, pShow->filterTb);
263,679✔
3718
    mDebug("mndRetrieveStbCol get system table cols, rows:%d, db:%s", numOfRows, pShow->db);
263,679✔
3719
    pShow->sysDbRsp = true;
263,679✔
3720
  }
3721

3722
  if (buildWhichDBs & BUILD_COL_FOR_USER_DB) {
263,919✔
3723
    SDbObj *pDb = NULL;
263,899✔
3724
    if (strlen(pShow->db) > 0) {
263,899✔
3725
      pDb = mndAcquireDb(pMnode, pShow->db);
21,450✔
3726
      if (pDb == NULL && TSDB_CODE_MND_DB_NOT_EXIST != terrno && pBlock->info.rows == 0) return terrno;
21,450✔
3727
    }
3728

3729
    char typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
263,899✔
3730
    STR_TO_VARSTR(typeName, "SUPER_TABLE");
263,899✔
3731
    bool fetch = pShow->restore ? false : true;
263,899✔
3732
    pShow->restore = false;
263,899✔
3733
    while (numOfRows < rows) {
424,895✔
3734
      if (fetch) {
424,895✔
3735
        pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb);
424,655✔
3736
        if (pShow->pIter == NULL) break;
424,655✔
3737
      } else {
3738
        fetch = true;
240✔
3739
        void *pKey = taosHashGetKey(pShow->pIter, NULL);
240✔
3740
        pStb = sdbAcquire(pSdb, SDB_STB, pKey);
240✔
3741
        if (!pStb) continue;
240✔
3742
      }
3743

3744
      if (pDb != NULL && pStb->dbUid != pDb->uid) {
161,236✔
3745
        sdbRelease(pSdb, pStb);
120✔
3746
        continue;
120✔
3747
      }
3748

3749
      SName name = {0};
161,116✔
3750
      char  stbName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
161,116✔
3751
      mndExtractTbNameFromStbFullName(pStb->name, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN);
161,116✔
3752
      if (pShow->filterTb[0] && strncmp(pShow->filterTb, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN) != 0) {
161,116✔
3753
        sdbRelease(pSdb, pStb);
×
3754
        continue;
×
3755
      }
3756

3757
      if ((numOfRows + pStb->numOfColumns) > rows) {
161,116✔
3758
        pShow->restore = true;
240✔
3759
        if (numOfRows == 0) {
240✔
3760
          mError("mndRetrieveStbCol failed to get stable cols since buf:%d less than result:%d, stable name:%s, db:%s",
×
3761
                 rows, pStb->numOfColumns, pStb->name, pStb->db);
3762
        }
3763
        sdbRelease(pSdb, pStb);
240✔
3764
        break;
240✔
3765
      }
3766

3767
      varDataSetLen(stbName, strlen(&stbName[VARSTR_HEADER_SIZE]));
160,876✔
3768

3769
      mDebug("mndRetrieveStbCol get stable cols, stable name:%s, db:%s", pStb->name, pStb->db);
160,876✔
3770

3771
      char db[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
160,876✔
3772
      RETRIEVE_CHECK_GOTO(tNameFromString(&name, pStb->db, T_NAME_ACCT | T_NAME_DB), pStb, &lino, _OVER);
160,876✔
3773
      RETRIEVE_CHECK_GOTO(tNameGetDbName(&name, varDataVal(db)), pStb, &lino, _OVER);
160,876✔
3774
      varDataSetLen(db, strlen(varDataVal(db)));
160,876✔
3775

3776
      for (int i = 0; i < pStb->numOfColumns; i++) {
4,597,622✔
3777
        int32_t          cols = 0;
4,436,746✔
3778
        SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
4,436,746✔
3779
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stbName, false), pStb, &lino, _OVER);
4,436,746✔
3780

3781
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
4,436,746✔
3782
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)db, false), pStb, &lino, _OVER);
4,436,746✔
3783

3784
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
4,436,746✔
3785
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, typeName, false), pStb, &lino, _OVER);
4,436,746✔
3786

3787
        // col name
3788
        char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
4,436,746✔
3789
        STR_TO_VARSTR(colName, pStb->pColumns[i].name);
4,436,746✔
3790
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
4,436,746✔
3791
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, colName, false), pStb, &lino, _OVER);
4,436,746✔
3792

3793
        // col type
3794
        int8_t colType = pStb->pColumns[i].type;
4,436,746✔
3795
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
4,436,746✔
3796
        char colTypeStr[VARSTR_HEADER_SIZE + 32];
4,436,746✔
3797
        int  colTypeLen =
4,436,746✔
3798
            tsnprintf(varDataVal(colTypeStr), sizeof(colTypeStr) - VARSTR_HEADER_SIZE, "%s", tDataTypes[colType].name);
4,436,746✔
3799
        if (colType == TSDB_DATA_TYPE_VARCHAR) {
4,436,746✔
3800
          colTypeLen +=
127,640✔
3801
              tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE,
127,640✔
3802
                        "(%d)", (int32_t)(pStb->pColumns[i].bytes - VARSTR_HEADER_SIZE));
127,640✔
3803
        } else if (colType == TSDB_DATA_TYPE_NCHAR) {
4,309,106✔
3804
          colTypeLen +=
127,640✔
3805
              tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE,
127,640✔
3806
                        "(%d)", (int32_t)((pStb->pColumns[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
127,640✔
3807
        } else if (IS_DECIMAL_TYPE(colType)) {
4,181,466✔
3808
          STypeMod typeMod = pStb->pExtSchemas[i].typeMod;
×
3809
          uint8_t prec = 0, scale = 0;
×
3810
          decimalFromTypeMod(typeMod, &prec, &scale);
×
3811
          colTypeLen += sprintf(varDataVal(colTypeStr) + colTypeLen, "(%d,%d)", prec, scale);
×
3812
        }
3813
        varDataSetLen(colTypeStr, colTypeLen);
4,436,746✔
3814
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (char *)colTypeStr, false), pStb, &lino, _OVER);
4,436,746✔
3815

3816
        // col length
3817
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
4,436,746✔
3818
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->pColumns[i].bytes, false), pStb,
4,436,746✔
3819
                            &lino, _OVER);
3820
        
3821
        // col precision, col scale, col nullable, col source
3822
        for (int32_t j = 6; j <= 9; ++j) {
22,183,730✔
3823
          pColInfo = taosArrayGet(pBlock->pDataBlock, j);
17,746,984✔
3824
          colDataSetNULL(pColInfo, numOfRows);
17,746,984✔
3825
        }
3826

3827
        // col id
3828
        pColInfo = taosArrayGet(pBlock->pDataBlock, 10);
4,436,746✔
3829
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->pColumns[i].colId, false), pStb,
4,436,746✔
3830
                            &lino, _OVER);
3831
        numOfRows++;
4,436,746✔
3832
      }
3833

3834
      sdbRelease(pSdb, pStb);
160,876✔
3835
    }
3836

3837
    if (pDb != NULL) {
263,899✔
3838
      mndReleaseDb(pMnode, pDb);
21,262✔
3839
    }
3840
  }
3841

3842
  mDebug("mndRetrieveStbCol success, rows:%d, pShow->numOfRows:%d", numOfRows, pShow->numOfRows);
263,919✔
3843
  goto _OVER;
263,919✔
3844

3845
_ERROR:
3846
  mError("failed to mndRetrieveStbCol, rows:%d, pShow->numOfRows:%d, at %s:%d since %s", numOfRows, pShow->numOfRows,
3847
         __FUNCTION__, lino, tstrerror(code));
3848

3849
_OVER:
263,919✔
3850
  pShow->numOfRows += numOfRows;
263,919✔
3851
  return numOfRows;
263,919✔
3852
}
3853

3854
static void mndCancelGetNextStb(SMnode *pMnode, void *pIter) {
10✔
3855
  SSdb *pSdb = pMnode->pSdb;
10✔
3856
  sdbCancelFetchByType(pSdb, pIter, SDB_STB);
10✔
3857
}
10✔
3858

3859
const char *mndGetStbStr(const char *src) {
×
3860
  char *posDb = strstr(src, TS_PATH_DELIMITER);
×
3861
  if (posDb != NULL) ++posDb;
×
3862
  if (posDb == NULL) return src;
×
3863

3864
  char *posStb = strstr(posDb, TS_PATH_DELIMITER);
×
3865
  if (posStb != NULL) ++posStb;
×
3866
  if (posStb == NULL) return posDb;
×
3867
  return posStb;
×
3868
}
3869

3870
static int32_t mndCheckIndexReq(SCreateTagIndexReq *pReq) {
×
3871
  // impl
3872
  return TSDB_CODE_SUCCESS;
×
3873
}
3874

3875
/*int32_t mndAddIndexImpl(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp, void *sql,
3876
                        int32_t len) {
3877
  // impl later
3878
  int32_t code = 0;
3879
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "create-stb-index");
3880
  if (pTrans == NULL) goto _OVER;
3881

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

3886
  if (mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb) != 0) goto _OVER;
3887
  if (mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb) != 0) goto _OVER;
3888
  if (mndSetAlterStbRedoActions2(pMnode, pTrans, pDb, pStb, sql, len) != 0) goto _OVER;
3889
  if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
3890

3891
  return code;
3892

3893
_OVER:
3894
  mndTransDrop(pTrans);
3895
  return code;
3896
}
3897
static int32_t mndAddIndex(SMnode *pMnode, SRpcMsg *pReq, SCreateTagIndexReq *tagIdxReq, SDbObj *pDb, SStbObj *pOld) {
3898
  bool    needRsp = true;
3899
  int32_t code = -1;
3900
  SField *pField0 = NULL;
3901

3902
  SStbObj  stbObj = {0};
3903
  SStbObj *pNew = &stbObj;
3904

3905
  taosRLockLatch(&pOld->lock);
3906
  memcpy(&stbObj, pOld, sizeof(SStbObj));
3907
  taosRUnLockLatch(&pOld->lock);
3908

3909
  stbObj.pColumns = NULL;
3910
  stbObj.pTags = NULL;
3911
  stbObj.updateTime = taosGetTimestampMs();
3912
  stbObj.lock = 0;
3913

3914
  int32_t tag = mndFindSuperTableTagIndex(pOld, tagIdxReq->colName);
3915
  if (tag < 0) {
3916
    terrno = TSDB_CODE_MND_TAG_NOT_EXIST;
3917
    return -1;
3918
  }
3919
  if (mndAllocStbSchemas(pOld, pNew) != 0) {
3920
    return -1;
3921
  }
3922

3923
  SSchema *pTag = pNew->pTags + tag;
3924
  if (IS_IDX_ON(pTag)) {
3925
    terrno = TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST;
3926
    return -1;
3927
  } else {
3928
    pTag->flags |= COL_IDX_ON;
3929
  }
3930
  pNew->tagVer++;
3931

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

3934
  return code;
3935
}
3936
static int32_t mndProcessCreateIndexReq(SRpcMsg *pReq) {
3937
  SMnode            *pMnode = pReq->info.node;
3938
  int32_t            code = -1;
3939
  SDbObj            *pDb = NULL;
3940
  SStbObj           *pStb = NULL;
3941
  SCreateTagIndexReq tagIdxReq = {0};
3942

3943
  if (tDeserializeSCreateTagIdxReq(pReq->pCont, pReq->contLen, &tagIdxReq) != 0) {
3944
    terrno = TSDB_CODE_INVALID_MSG;
3945
    goto _OVER;
3946
  }
3947

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

3950
  if (mndCheckIndexReq(&tagIdxReq) != TSDB_CODE_SUCCESS) {
3951
    goto _OVER;
3952
  }
3953

3954
  pDb = mndAcquireDbByStb(pMnode, tagIdxReq.dbFName);
3955
  if (pDb == NULL) {
3956
    terrno = TSDB_CODE_MND_DB_NOT_EXIST;
3957
    goto _OVER;
3958
  }
3959

3960
  pStb = mndAcquireStb(pMnode, tagIdxReq.stbName);
3961
  if (pStb == NULL) {
3962
    terrno = TSDB_CODE_MND_STB_NOT_EXIST;
3963
    goto _OVER;
3964
  }
3965
  if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_WRITE_DB, pDb) != 0) {
3966
    goto _OVER;
3967
  }
3968

3969
  code = mndAddIndex(pMnode, pReq, &tagIdxReq, pDb, pStb);
3970
  if (terrno == TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST || terrno == TSDB_CODE_MND_TAG_NOT_EXIST) {
3971
    return terrno;
3972
  } else {
3973
    if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
3974
  }
3975
_OVER:
3976
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
3977
    mError("stb:%s, failed to create index since %s", tagIdxReq.stbName, terrstr());
3978
  }
3979
  mndReleaseStb(pMnode, pStb);
3980
  mndReleaseDb(pMnode, pDb);
3981
  return code;
3982
}
3983
static int32_t mndProcessDropIndexReq(SRpcMsg *pReq) {
3984
  SMnode          *pMnode = pReq->info.node;
3985
  int32_t          code = -1;
3986
  SDbObj          *pDb = NULL;
3987
  SStbObj         *pStb = NULL;
3988
  SDropTagIndexReq dropReq = {0};
3989
  if (tDeserializeSDropTagIdxReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
3990
    terrno = TSDB_CODE_INVALID_MSG;
3991
    goto _OVER;
3992
  }
3993
  //
3994
  return TSDB_CODE_SUCCESS;
3995
_OVER:
3996
  return code;
3997
}*/
3998

3999
static int32_t mndProcessDropStbReqFromMNode(SRpcMsg *pReq) {
×
4000
  int32_t code = mndProcessDropStbReq(pReq);
×
4001
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
×
4002
    pReq->info.rsp = rpcMallocCont(1);
×
4003
    pReq->info.rspLen = 1;
×
4004
    pReq->info.noResp = false;
×
4005
    pReq->code = code;
×
4006
  }
4007
  return code;
×
4008
}
4009

4010
typedef struct SVDropTbVgReqs {
4011
  SArray     *pBatchReqs;
4012
  SVgroupInfo info;
4013
} SVDropTbVgReqs;
4014

4015
typedef struct SMDropTbDbInfo {
4016
  SArray *dbVgInfos;
4017
  int32_t hashPrefix;
4018
  int32_t hashSuffix;
4019
  int32_t hashMethod;
4020
} SMDropTbDbInfo;
4021

4022
typedef struct SMDropTbTsmaInfo {
4023
  char           tsmaResTbDbFName[TSDB_DB_FNAME_LEN];
4024
  char           tsmaResTbNamePrefix[TSDB_TABLE_FNAME_LEN];
4025
  int32_t        suid;
4026
  SMDropTbDbInfo dbInfo;  // reference to DbInfo in pDbMap
4027
} SMDropTbTsmaInfo;
4028

4029
typedef struct SMDropTbTsmaInfos {
4030
  SArray *pTsmaInfos;  // SMDropTbTsmaInfo
4031
} SMDropTbTsmaInfos;
4032

4033
typedef struct SMndDropTbsWithTsmaCtx {
4034
  SHashObj *pVgMap;  // <vgId, SVDropTbVgReqs>
4035
} SMndDropTbsWithTsmaCtx;
4036

4037
static int32_t mndDropTbForSingleVg(SMnode *pMnode, SMndDropTbsWithTsmaCtx *pCtx, SArray *pTbs, int32_t vgId);
4038

4039
static void destroySVDropTbBatchReqs(void *p);
4040
static void mndDestroyDropTbsWithTsmaCtx(SMndDropTbsWithTsmaCtx *p) {
8,106✔
4041
  if (!p) return;
8,106✔
4042

4043
  if (p->pVgMap) {
8,106✔
4044
    void *pIter = taosHashIterate(p->pVgMap, NULL);
8,106✔
4045
    while (pIter) {
16,212✔
4046
      SVDropTbVgReqs *pReqs = pIter;
8,106✔
4047
      taosArrayDestroyEx(pReqs->pBatchReqs, destroySVDropTbBatchReqs);
8,106✔
4048
      pIter = taosHashIterate(p->pVgMap, pIter);
8,106✔
4049
    }
4050
    taosHashCleanup(p->pVgMap);
8,106✔
4051
  }
4052
  taosMemoryFree(p);
8,106✔
4053
}
4054

4055
static int32_t mndInitDropTbsWithTsmaCtx(SMndDropTbsWithTsmaCtx **ppCtx) {
8,106✔
4056
  int32_t                 code = 0;
8,106✔
4057
  SMndDropTbsWithTsmaCtx *pCtx = taosMemoryCalloc(1, sizeof(SMndDropTbsWithTsmaCtx));
8,106✔
4058
  if (!pCtx) return terrno;
8,106✔
4059

4060
  pCtx->pVgMap = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_NO_LOCK);
8,106✔
4061
  if (!pCtx->pVgMap) {
8,106✔
4062
    code = terrno;
×
4063
    goto _end;
×
4064
  }
4065

4066
  *ppCtx = pCtx;
8,106✔
4067
_end:
8,106✔
4068
  if (code) mndDestroyDropTbsWithTsmaCtx(pCtx);
8,106✔
4069
  return code;
8,106✔
4070
}
4071

4072
static void *mndBuildVDropTbsReq(SMnode *pMnode, const SVgroupInfo *pVgInfo, const SVDropTbBatchReq *pReq,
23,464✔
4073
                                 int32_t *len) {
4074
  int32_t   contLen = 0;
23,464✔
4075
  int32_t   ret = 0;
23,464✔
4076
  SMsgHead *pHead = NULL;
23,464✔
4077
  SEncoder  encoder = {0};
23,464✔
4078

4079
  tEncodeSize(tEncodeSVDropTbBatchReq, pReq, contLen, ret);
23,464✔
4080
  if (ret < 0) return NULL;
23,464✔
4081

4082
  contLen += sizeof(SMsgHead);
23,464✔
4083
  pHead = taosMemoryMalloc(contLen);
23,464✔
4084
  if (pHead == NULL) {
23,464✔
4085
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
4086
    return NULL;
×
4087
  }
4088

4089
  pHead->contLen = htonl(contLen);
23,464✔
4090
  pHead->vgId = htonl(pVgInfo->vgId);
23,464✔
4091

4092
  void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
23,464✔
4093

4094
  tEncoderInit(&encoder, pBuf, contLen - sizeof(SMsgHead));
23,464✔
4095
  int32_t code = tEncodeSVDropTbBatchReq(&encoder, pReq);
23,464✔
4096
  tEncoderClear(&encoder);
23,464✔
4097
  if (code != 0) return NULL;
23,464✔
4098

4099
  *len = contLen;
23,464✔
4100
  return pHead;
23,464✔
4101
}
4102

4103
static int32_t mndSetDropTbsRedoActions(SMnode *pMnode, STrans *pTrans, const SVDropTbVgReqs *pVgReqs, void *pCont,
23,464✔
4104
                                        int32_t contLen, tmsg_t msgType) {
4105
  STransAction action = {0};
23,464✔
4106
  action.epSet = pVgReqs->info.epSet;
23,464✔
4107
  action.pCont = pCont;
23,464✔
4108
  action.contLen = contLen;
23,464✔
4109
  action.msgType = msgType;
23,464✔
4110
  action.acceptableCode = TSDB_CODE_TDB_TABLE_NOT_EXIST;
23,464✔
4111
  return mndTransAppendRedoAction(pTrans, &action);
23,464✔
4112
}
4113

4114
static int32_t mndBuildDropTbRedoActions(SMnode *pMnode, STrans *pTrans, SHashObj *pVgMap, tmsg_t msgType) {
5,866✔
4115
  int32_t code = 0;
5,866✔
4116
  void   *pIter = taosHashIterate(pVgMap, NULL);
5,866✔
4117
  while (pIter) {
11,732✔
4118
    const SVDropTbVgReqs *pVgReqs = pIter;
5,866✔
4119
    int32_t               len = 0;
5,866✔
4120
    for (int32_t i = 0; i < taosArrayGetSize(pVgReqs->pBatchReqs) && code == TSDB_CODE_SUCCESS; ++i) {
29,330✔
4121
      SVDropTbBatchReq *pBatchReq = taosArrayGet(pVgReqs->pBatchReqs, i);
23,464✔
4122
      void             *p = mndBuildVDropTbsReq(pMnode, &pVgReqs->info, pBatchReq, &len);
23,464✔
4123
      if (!p) {
23,464✔
4124
        code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
4125
        if (terrno != 0) code = terrno;
×
4126
        break;
×
4127
      }
4128
      if ((code = mndSetDropTbsRedoActions(pMnode, pTrans, pVgReqs, p, len, msgType)) != 0) {
23,464✔
4129
        break;
×
4130
      }
4131
    }
4132
    if (TSDB_CODE_SUCCESS != code) {
5,866✔
4133
      taosHashCancelIterate(pVgMap, pIter);
×
4134
      break;
×
4135
    }
4136
    pIter = taosHashIterate(pVgMap, pIter);
5,866✔
4137
  }
4138
  return code;
5,866✔
4139
}
4140

4141
static int32_t mndCreateDropTbsTxnPrepare(SRpcMsg *pRsp, SMndDropTbsWithTsmaCtx *pCtx) {
8,106✔
4142
  int32_t code = 0;
8,106✔
4143
  SMnode *pMnode = pRsp->info.node;
8,106✔
4144
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, pRsp, "drop-tbs");
8,106✔
4145
  mndTransSetChangeless(pTrans);
8,106✔
4146
  mndTransSetSerial(pTrans);
8,106✔
4147
  if (pTrans == NULL) {
8,106✔
4148
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
4149
    if (terrno != 0) code = terrno;
×
4150
    goto _OVER;
×
4151
  }
4152

4153
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
8,106✔
4154

4155
  if ((code = mndBuildDropTbRedoActions(pMnode, pTrans, pCtx->pVgMap, TDMT_VND_DROP_TABLE)) != 0) goto _OVER;
5,866✔
4156
  if ((code = mndTransPrepare(pMnode, pTrans)) != 0) goto _OVER;
5,866✔
4157

4158
_OVER:
5,866✔
4159
  mndTransDrop(pTrans);
8,106✔
4160
  TAOS_RETURN(code);
8,106✔
4161
}
4162

4163
static int32_t mndProcessDropTbWithTsma(SRpcMsg *pReq) {
×
4164
  int32_t      code = -1;
×
4165
  SMnode      *pMnode = pReq->info.node;
×
4166
  SDbObj      *pDb = NULL;
×
4167
  SStbObj     *pStb = NULL;
×
4168
  SMDropTbsReq dropReq = {0};
×
4169
  bool         locked = false;
×
4170
  if (tDeserializeSMDropTbsReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
×
4171
    code = TSDB_CODE_INVALID_MSG;
×
4172
    goto _OVER;
×
4173
  }
4174

4175
  SMndDropTbsWithTsmaCtx *pCtx = NULL;
×
4176
  code = mndInitDropTbsWithTsmaCtx(&pCtx);
×
4177
  if (code) goto _OVER;
×
4178
  for (int32_t i = 0; i < dropReq.pVgReqs->size; ++i) {
×
4179
    SMDropTbReqsOnSingleVg *pReq = taosArrayGet(dropReq.pVgReqs, i);
×
4180
    code = mndDropTbForSingleVg(pMnode, pCtx, pReq->pTbs, pReq->vgInfo.vgId);
×
4181
    if (code) goto _OVER;
×
4182
  }
4183
  code = mndCreateDropTbsTxnPrepare(pReq, pCtx);
×
4184
  if (code == 0) {
×
4185
    code = TSDB_CODE_ACTION_IN_PROGRESS;
×
4186
  }
4187
_OVER:
×
4188
  tFreeSMDropTbsReq(&dropReq);
×
4189
  if (pCtx) mndDestroyDropTbsWithTsmaCtx(pCtx);
×
4190
  TAOS_RETURN(code);
×
4191
}
4192

4193
static int32_t createDropTbBatchReq(const SVDropTbReq *pReq, SVDropTbBatchReq *pBatchReq) {
31,976✔
4194
  pBatchReq->nReqs = 1;
31,976✔
4195
  pBatchReq->pArray = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SVDropTbReq));
31,976✔
4196
  if (!pBatchReq->pArray) return terrno;
31,976✔
4197
  if (taosArrayPush(pBatchReq->pArray, pReq) == NULL) {
63,952✔
4198
    taosArrayDestroy(pBatchReq->pArray);
×
4199
    pBatchReq->pArray = NULL;
×
4200
    return terrno;
×
4201
  }
4202
  return TSDB_CODE_SUCCESS;
31,976✔
4203
}
4204

4205
static void destroySVDropTbBatchReqs(void *p) {
31,976✔
4206
  SVDropTbBatchReq *pReq = p;
31,976✔
4207
  taosArrayDestroy(pReq->pArray);
31,976✔
4208
  pReq->pArray = NULL;
31,976✔
4209
}
31,976✔
4210

4211
static int32_t mndDropTbAdd(SMnode *pMnode, SHashObj *pVgHashMap, const SVgroupInfo *pVgInfo, char *name, tb_uid_t suid,
31,976✔
4212
                            bool ignoreNotExists) {
4213
  SVDropTbReq req = {.name = name, .suid = suid, .igNotExists = ignoreNotExists, .uid = 0};
31,976✔
4214

4215
  SVDropTbVgReqs *pVgReqs = taosHashGet(pVgHashMap, &pVgInfo->vgId, sizeof(pVgInfo->vgId));
31,976✔
4216
  SVDropTbVgReqs  vgReqs = {0};
31,976✔
4217
  if (pVgReqs == NULL) {
31,976✔
4218
    vgReqs.info = *pVgInfo;
8,106✔
4219
    vgReqs.pBatchReqs = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SVDropTbBatchReq));
8,106✔
4220
    if (!vgReqs.pBatchReqs) return terrno;
8,106✔
4221
    SVDropTbBatchReq batchReq = {0};
8,106✔
4222
    int32_t          code = createDropTbBatchReq(&req, &batchReq);
8,106✔
4223
    if (TSDB_CODE_SUCCESS != code) return code;
8,106✔
4224
    if (taosArrayPush(vgReqs.pBatchReqs, &batchReq) == NULL) {
16,212✔
4225
      taosArrayDestroy(batchReq.pArray);
×
4226
      return terrno;
×
4227
    }
4228
    if (taosHashPut(pVgHashMap, &pVgInfo->vgId, sizeof(pVgInfo->vgId), &vgReqs, sizeof(vgReqs)) != 0) {
8,106✔
4229
      taosArrayDestroyEx(vgReqs.pBatchReqs, destroySVDropTbBatchReqs);
×
4230
      return terrno;
×
4231
    }
4232
  } else {
4233
    SVDropTbBatchReq batchReq = {0};
23,870✔
4234
    int32_t          code = createDropTbBatchReq(&req, &batchReq);
23,870✔
4235
    if (TSDB_CODE_SUCCESS != code) return code;
23,870✔
4236
    if (taosArrayPush(pVgReqs->pBatchReqs, &batchReq) == NULL) {
47,740✔
4237
      taosArrayDestroy(batchReq.pArray);
×
4238
      return terrno;
×
4239
    }
4240
  }
4241
  return 0;
31,976✔
4242
}
4243

4244
static int32_t mndDropTbForSingleVg(SMnode *pMnode, SMndDropTbsWithTsmaCtx *pCtx, SArray *pTbs, int32_t vgId) {
8,106✔
4245
  int32_t code = 0;
8,106✔
4246

4247
  SVgObj *pVgObj = mndAcquireVgroup(pMnode, vgId);
8,106✔
4248
  if (!pVgObj) {
8,106✔
4249
    code = 0;
×
4250
    goto _end;
×
4251
  }
4252
  SVgroupInfo vgInfo = {.hashBegin = pVgObj->hashBegin,
16,212✔
4253
                        .hashEnd = pVgObj->hashEnd,
8,106✔
4254
                        .numOfTable = pVgObj->numOfTables,
8,106✔
4255
                        .vgId = pVgObj->vgId};
8,106✔
4256
  vgInfo.epSet = mndGetVgroupEpset(pMnode, pVgObj);
8,106✔
4257
  mndReleaseVgroup(pMnode, pVgObj);
8,106✔
4258

4259
  for (int32_t i = 0; i < pTbs->size; ++i) {
40,082✔
4260
    SVDropTbReq *pTb = taosArrayGet(pTbs, i);
31,976✔
4261
    TAOS_CHECK_GOTO(mndDropTbAdd(pMnode, pCtx->pVgMap, &vgInfo, pTb->name, pTb->suid, pTb->igNotExists), NULL, _end);
31,976✔
4262
  }
4263
_end:
8,106✔
4264
  return code;
8,106✔
4265
}
4266

4267
static int32_t mndProcessFetchTtlExpiredTbs(SRpcMsg *pRsp) {
3,339,995✔
4268
  int32_t                 code = -1;
3,339,995✔
4269
  SDecoder                decoder = {0};
3,339,995✔
4270
  SMnode                 *pMnode = pRsp->info.node;
3,339,995✔
4271
  SVFetchTtlExpiredTbsRsp rsp = {0};
3,339,995✔
4272
  SMndDropTbsWithTsmaCtx *pCtx = NULL;
3,339,995✔
4273
  if (pRsp->code != TSDB_CODE_SUCCESS) {
3,339,995✔
4274
    code = pRsp->code;
59,733✔
4275
    goto _end;
59,733✔
4276
  }
4277
  if (pRsp->contLen == 0) {
3,280,262✔
4278
    code = 0;
3,272,156✔
4279
    goto _end;
3,272,156✔
4280
  }
4281

4282
  tDecoderInit(&decoder, pRsp->pCont, pRsp->contLen);
8,106✔
4283
  code = tDecodeVFetchTtlExpiredTbsRsp(&decoder, &rsp);
8,106✔
4284
  if (code) goto _end;
8,106✔
4285

4286
  code = mndInitDropTbsWithTsmaCtx(&pCtx);
8,106✔
4287
  if (code) goto _end;
8,106✔
4288

4289
  code = mndDropTbForSingleVg(pMnode, pCtx, rsp.pExpiredTbs, rsp.vgId);
8,106✔
4290
  if (code) goto _end;
8,106✔
4291
  code = mndCreateDropTbsTxnPrepare(pRsp, pCtx);
8,106✔
4292
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
8,106✔
4293
_end:
3,339,949✔
4294
  if (pCtx) mndDestroyDropTbsWithTsmaCtx(pCtx);
3,339,995✔
4295
  tDecoderClear(&decoder);
3,339,995✔
4296
  tFreeFetchTtlExpiredTbsRsp(&rsp);
3,339,995✔
4297
  TAOS_RETURN(code);
3,339,995✔
4298
}
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