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

taosdata / TDengine / #3564

24 Dec 2024 05:40AM UTC coverage: 62.21% (+1.2%) from 61.045%
#3564

push

travis-ci

web-flow
Merge pull request #29289 from taosdata/fix/TD-33270-2

ci(stream):add stream unit test

138331 of 285924 branches covered (48.38%)

Branch coverage included in aggregate %.

215800 of 283329 relevant lines covered (76.17%)

19198660.97 hits per line

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

61.38
/source/dnode/vnode/src/meta/metaEntry2.c
1
/*
2
 * Copyright (c) 2023 Hongze Cheng <hzcheng@umich.edu>.
3
 * All rights reserved.
4
 *
5
 * This code is the intellectual property of Hongze Cheng.
6
 * Any reproduction or distribution, in whole or in part,
7
 * without the express written permission of Hongze Cheng is
8
 * strictly prohibited.
9
 */
10

11
#include "meta.h"
12

13
int32_t metaCloneEntry(const SMetaEntry *pEntry, SMetaEntry **ppEntry);
14
void    metaCloneEntryFree(SMetaEntry **ppEntry);
15
void    metaDestroyTagIdxKey(STagIdxKey *pTagIdxKey);
16
int     metaSaveJsonVarToIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const SSchema *pSchema);
17
int     metaDelJsonVarFromIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const SSchema *pSchema);
18
void    metaTimeSeriesNotifyCheck(SMeta *pMeta);
19
int     tagIdxKeyCmpr(const void *pKey1, int kLen1, const void *pKey2, int kLen2);
20

21
static int32_t metaGetChildUidsOfSuperTable(SMeta *pMeta, tb_uid_t suid, SArray **childList);
22
static int32_t metaFetchTagIdxKey(SMeta *pMeta, const SMetaEntry *pEntry, const SSchema *pTagColumn,
23
                                  STagIdxKey **ppTagIdxKey, int32_t *pTagIdxKeySize);
24
static void    metaFetchTagIdxKeyFree(STagIdxKey **ppTagIdxKey);
25

26
#define metaErr(VGID, ERRNO)                                                                                     \
27
  do {                                                                                                           \
28
    metaError("vgId:%d, %s failed at %s:%d since %s, version:%" PRId64 " type:%d uid:%" PRId64 " name:%s", VGID, \
29
              __func__, __FILE__, __LINE__, tstrerror(ERRNO), pEntry->version, pEntry->type, pEntry->uid,        \
30
              pEntry->type > 0 ? pEntry->name : NULL);                                                           \
31
  } while (0)
32

33
typedef enum {
34
  META_ENTRY_TABLE = 0,
35
  META_SCHEMA_TABLE,
36
  META_UID_IDX,
37
  META_NAME_IDX,
38
  META_SUID_IDX,
39
  META_CHILD_IDX,
40
  META_TAG_IDX,
41
  META_BTIME_IDX,
42
  META_TTL_IDX,
43
  META_TABLE_MAX,
44
} EMetaTable;
45

46
typedef enum {
47
  META_TABLE_OP_INSERT = 0,
48
  META_TABLE_OP_UPDATA,
49
  META_TABLE_OP_DELETE,
50
  META_TABLE_OP_MAX,
51
} EMetaTableOp;
52

53
typedef struct {
54
  const SMetaEntry *pEntry;
55
  const SMetaEntry *pSuperEntry;
56
  const SMetaEntry *pOldEntry;
57
} SMetaHandleParam;
58

59
typedef struct {
60
  EMetaTable   table;
61
  EMetaTableOp op;
62
} SMetaTableOp;
63

64
int32_t metaFetchEntryByUid(SMeta *pMeta, int64_t uid, SMetaEntry **ppEntry) {
254,881✔
65
  int32_t code = TSDB_CODE_SUCCESS;
254,881✔
66
  void   *value = NULL;
254,881✔
67
  int32_t valueSize = 0;
254,881✔
68

69
  // search uid index
70
  code = tdbTbGet(pMeta->pUidIdx, &uid, sizeof(uid), &value, &valueSize);
254,881✔
71
  if (TSDB_CODE_SUCCESS != code) {
254,963!
72
    metaError("vgId:%d, failed to get entry by uid:%" PRId64 " since %s", TD_VID(pMeta->pVnode), uid, tstrerror(code));
×
73
    return code;
×
74
  }
75

76
  // search entry table
77
  STbDbKey key = {
254,963✔
78
      .version = ((SUidIdxVal *)value)->version,
254,963✔
79
      .uid = uid,
80
  };
81
  tdbFreeClear(value);
254,963✔
82

83
  code = tdbTbGet(pMeta->pTbDb, &key, sizeof(key), &value, &valueSize);
254,964✔
84
  if (TSDB_CODE_SUCCESS != code) {
254,972!
85
    metaError("vgId:%d, failed to get entry by uid:%" PRId64 " since %s", TD_VID(pMeta->pVnode), uid, tstrerror(code));
×
86
    code = TSDB_CODE_INTERNAL_ERROR;
×
87
    return code;
×
88
  }
89

90
  // decode entry
91
  SDecoder   decoder = {0};
254,972✔
92
  SMetaEntry entry = {0};
254,972✔
93

94
  tDecoderInit(&decoder, value, valueSize);
254,972✔
95
  code = metaDecodeEntry(&decoder, &entry);
254,955✔
96
  if (code) {
254,849!
97
    metaError("vgId:%d, failed to decode entry by uid:%" PRId64 " since %s", TD_VID(pMeta->pVnode), uid,
×
98
              tstrerror(code));
99
    tDecoderClear(&decoder);
×
100
    tdbFreeClear(value);
×
101
    return code;
×
102
  }
103

104
  code = metaCloneEntry(&entry, ppEntry);
254,849✔
105
  if (code) {
254,926!
106
    metaError("vgId:%d, failed to clone entry by uid:%" PRId64 " since %s", TD_VID(pMeta->pVnode), uid,
×
107
              tstrerror(code));
108
    tDecoderClear(&decoder);
×
109
    tdbFreeClear(value);
×
110
    return code;
×
111
  }
112

113
  tdbFreeClear(value);
254,926✔
114
  tDecoderClear(&decoder);
254,946✔
115
  return code;
254,987✔
116
}
117

118
int32_t metaFetchEntryByName(SMeta *pMeta, const char *name, SMetaEntry **ppEntry) {
8,353✔
119
  int32_t code = TSDB_CODE_SUCCESS;
8,353✔
120
  void   *value = NULL;
8,353✔
121
  int32_t valueSize = 0;
8,353✔
122

123
  code = tdbTbGet(pMeta->pNameIdx, name, strlen(name) + 1, &value, &valueSize);
8,353✔
124
  if (TSDB_CODE_SUCCESS != code) {
8,353!
125
    metaError("vgId:%d, failed to get entry by name:%s since %s", TD_VID(pMeta->pVnode), name, tstrerror(code));
×
126
    return code;
×
127
  }
128
  int64_t uid = *(int64_t *)value;
8,353✔
129
  tdbFreeClear(value);
8,353✔
130

131
  code = metaFetchEntryByUid(pMeta, uid, ppEntry);
8,358✔
132
  if (TSDB_CODE_SUCCESS != code) {
8,361!
133
    metaError("vgId:%d, failed to get entry by uid:%" PRId64 " since %s", TD_VID(pMeta->pVnode), uid, tstrerror(code));
×
134
    code = TSDB_CODE_INTERNAL_ERROR;
×
135
  }
136
  return code;
8,361✔
137
}
138

139
void metaFetchEntryFree(SMetaEntry **ppEntry) { metaCloneEntryFree(ppEntry); }
254,918✔
140

141
// Entry Table
142
static int32_t metaEntryTableUpsert(SMeta *pMeta, const SMetaHandleParam *pParam, EMetaTableOp op) {
271,903✔
143
  const SMetaEntry *pEntry = pParam->pEntry;
271,903✔
144

145
  int32_t  code = TSDB_CODE_SUCCESS;
271,903✔
146
  int32_t  vgId = TD_VID(pMeta->pVnode);
271,903✔
147
  void    *value = NULL;
271,903✔
148
  int32_t  valueSize = 0;
271,903✔
149
  SEncoder encoder = {0};
271,903✔
150
  STbDbKey key = {
271,903✔
151
      .version = pEntry->version,
271,903✔
152
      .uid = pEntry->uid,
271,903✔
153
  };
154

155
  // encode entry
156
  tEncodeSize(metaEncodeEntry, pEntry, valueSize, code);
271,903!
157
  if (code != 0) {
271,810!
158
    metaErr(vgId, code);
×
159
    return code;
×
160
  }
161

162
  value = taosMemoryMalloc(valueSize);
271,810!
163
  if (NULL == value) {
271,780!
164
    metaErr(vgId, terrno);
×
165
    return terrno;
×
166
  }
167

168
  tEncoderInit(&encoder, value, valueSize);
271,780✔
169
  code = metaEncodeEntry(&encoder, pEntry);
271,801✔
170
  if (code) {
271,792!
171
    metaErr(vgId, code);
×
172
    tEncoderClear(&encoder);
×
173
    taosMemoryFree(value);
×
174
    return code;
×
175
  }
176
  tEncoderClear(&encoder);
271,792✔
177

178
  // put to tdb
179
  if (META_TABLE_OP_INSERT == op) {
271,907✔
180
    code = tdbTbInsert(pMeta->pTbDb, &key, sizeof(key), value, valueSize, pMeta->txn);
256,553✔
181
  } else if (META_TABLE_OP_UPDATA == op) {
15,354✔
182
    code = tdbTbUpsert(pMeta->pTbDb, &key, sizeof(key), value, valueSize, pMeta->txn);
10,441✔
183
  } else if (META_TABLE_OP_DELETE == op) {
4,913!
184
    code = tdbTbInsert(pMeta->pTbDb, &key, sizeof(key), value, valueSize, pMeta->txn);
4,913✔
185
  } else {
186
    code = TSDB_CODE_INVALID_PARA;
×
187
  }
188
  if (TSDB_CODE_SUCCESS != code) {
272,003!
189
    metaErr(vgId, code);
×
190
  }
191
  taosMemoryFree(value);
271,933!
192
  return code;
271,963✔
193
}
194

195
static int32_t metaEntryTableInsert(SMeta *pMeta, const SMetaHandleParam *pParam) {
256,193✔
196
  return metaEntryTableUpsert(pMeta, pParam, META_TABLE_OP_INSERT);
256,193✔
197
}
198

199
static int32_t metaEntryTableUpdate(SMeta *pMeta, const SMetaHandleParam *pParam) {
10,430✔
200
  return metaEntryTableUpsert(pMeta, pParam, META_TABLE_OP_UPDATA);
10,430✔
201
}
202

203
static int32_t metaEntryTableDelete(SMeta *pMeta, const SMetaHandleParam *pParam) {
4,913✔
204
  return metaEntryTableUpsert(pMeta, pParam, META_TABLE_OP_DELETE);
4,913✔
205
}
206

207
// Schema Table
208
static int32_t metaSchemaTableUpsert(SMeta *pMeta, const SMetaHandleParam *pParam, EMetaTableOp op) {
45,133✔
209
  int32_t  code = TSDB_CODE_SUCCESS;
45,133✔
210
  int32_t  vgId = TD_VID(pMeta->pVnode);
45,133✔
211
  SEncoder encoder = {0};
45,133✔
212
  void    *value = NULL;
45,133✔
213
  int32_t  valueSize = 0;
45,133✔
214

215
  const SMetaEntry     *pEntry = pParam->pEntry;
45,133✔
216
  const SSchemaWrapper *pSchema = NULL;
45,133✔
217
  if (pEntry->type == TSDB_SUPER_TABLE) {
45,133✔
218
    pSchema = &pEntry->stbEntry.schemaRow;
30,745✔
219
  } else if (pEntry->type == TSDB_NORMAL_TABLE) {
14,388!
220
    pSchema = &pEntry->ntbEntry.schemaRow;
14,408✔
221
  } else {
222
    return TSDB_CODE_INVALID_PARA;
×
223
  }
224
  SSkmDbKey key = {
45,153✔
225
      .uid = pEntry->uid,
45,153✔
226
      .sver = pSchema->version,
45,153✔
227
  };
228

229
  // encode schema
230
  tEncodeSize(tEncodeSSchemaWrapper, pSchema, valueSize, code);
90,322✔
231
  if (TSDB_CODE_SUCCESS != code) {
44,995!
232
    metaErr(vgId, code);
×
233
    return code;
×
234
  }
235

236
  value = taosMemoryMalloc(valueSize);
44,995!
237
  if (NULL == value) {
44,910!
238
    metaErr(vgId, terrno);
×
239
    return terrno;
×
240
  }
241

242
  tEncoderInit(&encoder, value, valueSize);
44,910✔
243
  code = tEncodeSSchemaWrapper(&encoder, pSchema);
44,962✔
244
  if (TSDB_CODE_SUCCESS != code) {
44,962!
245
    metaErr(vgId, code);
×
246
    tEncoderClear(&encoder);
×
247
    taosMemoryFree(value);
×
248
    return code;
×
249
  }
250
  tEncoderClear(&encoder);
44,962✔
251

252
  // put to tdb
253
  if (META_TABLE_OP_INSERT == op) {
44,888!
254
    code = tdbTbInsert(pMeta->pSkmDb, &key, sizeof(key), value, valueSize, pMeta->txn);
×
255
  } else if (META_TABLE_OP_UPDATA == op) {
44,947!
256
    code = tdbTbUpsert(pMeta->pSkmDb, &key, sizeof(key), value, valueSize, pMeta->txn);
44,947✔
257
  } else {
258
    code = TSDB_CODE_INVALID_PARA;
×
259
  }
260
  if (TSDB_CODE_SUCCESS != code) {
45,165!
261
    metaErr(vgId, code);
×
262
  }
263
  taosMemoryFree(value);
45,144!
264
  return code;
45,145✔
265
}
266

267
static int32_t metaSchemaTableInsert(SMeta *pMeta, const SMetaHandleParam *pParam) {
×
268
  return metaSchemaTableUpsert(pMeta, pParam, META_TABLE_OP_INSERT);
×
269
}
270

271
static int32_t metaAddOrDropTagIndexOfSuperTable(SMeta *pMeta, const SMetaHandleParam *pParam,
133,296✔
272
                                                 const SSchema *pOldColumn, const SSchema *pNewColumn) {
273
  int32_t code = TSDB_CODE_SUCCESS;
133,296✔
274

275
  const SMetaEntry *pEntry = pParam->pEntry;
133,296✔
276
  const SMetaEntry *pOldEntry = pParam->pOldEntry;
133,296✔
277
  enum { ADD_INDEX, DROP_INDEX } action;
278

279
  if (pOldColumn && pNewColumn) {
133,296✔
280
    if (IS_IDX_ON(pOldColumn) && IS_IDX_ON(pNewColumn)) {
131,455✔
281
      return TSDB_CODE_SUCCESS;
3,238✔
282
    } else if (IS_IDX_ON(pOldColumn) && !IS_IDX_ON(pNewColumn)) {
128,217!
283
      action = DROP_INDEX;
2,192✔
284
    } else if (!IS_IDX_ON(pOldColumn) && IS_IDX_ON(pNewColumn)) {
126,025!
285
      action = ADD_INDEX;
949✔
286
    } else {
287
      return TSDB_CODE_SUCCESS;
125,076✔
288
    }
289
  } else if (pOldColumn) {
1,841✔
290
    if (IS_IDX_ON(pOldColumn)) {
770✔
291
      action = DROP_INDEX;
17✔
292
    } else {
293
      return TSDB_CODE_SUCCESS;
753✔
294
    }
295
  } else {
296
    if (IS_IDX_ON(pNewColumn)) {
1,071!
297
      action = ADD_INDEX;
×
298
    } else {
299
      return TSDB_CODE_SUCCESS;
1,071✔
300
    }
301
  }
302

303
  // fetch all child tables
304
  SArray *childTables = 0;
3,158✔
305
  code = metaGetChildUidsOfSuperTable(pMeta, pEntry->uid, &childTables);
3,158✔
306
  if (code) {
3,157!
307
    metaErr(TD_VID(pMeta->pVnode), code);
×
308
    return code;
×
309
  }
310

311
  // do drop or add index
312
  for (int32_t i = 0; i < taosArrayGetSize(childTables); i++) {
8,147✔
313
    int64_t uid = *(int64_t *)taosArrayGet(childTables, i);
4,989✔
314

315
    // fetch child entry
316
    SMetaEntry *pChildEntry = NULL;
4,989✔
317
    code = metaFetchEntryByUid(pMeta, uid, &pChildEntry);
4,989✔
318
    if (code) {
4,990!
319
      metaErr(TD_VID(pMeta->pVnode), code);
×
320
      taosArrayDestroy(childTables);
×
321
      return code;
×
322
    }
323

324
    STagIdxKey *pTagIdxKey = NULL;
4,990✔
325
    int32_t     tagIdxKeySize = 0;
4,990✔
326

327
    if (action == ADD_INDEX) {
4,990✔
328
      code = metaFetchTagIdxKey(pMeta, pChildEntry, pNewColumn, &pTagIdxKey, &tagIdxKeySize);
1,720✔
329
      if (code) {
1,720!
330
        metaErr(TD_VID(pMeta->pVnode), code);
×
331
        taosArrayDestroy(childTables);
×
332
        metaFetchEntryFree(&pChildEntry);
×
333
        return code;
×
334
      }
335

336
      code = tdbTbInsert(pMeta->pTagIdx, pTagIdxKey, tagIdxKeySize, NULL, 0, pMeta->txn);
1,720✔
337
      if (code) {
1,720!
338
        metaErr(TD_VID(pMeta->pVnode), code);
×
339
        taosArrayDestroy(childTables);
×
340
        metaFetchEntryFree(&pChildEntry);
×
341
        metaFetchTagIdxKeyFree(&pTagIdxKey);
×
342
        return code;
×
343
      }
344
    } else {
345
      code = metaFetchTagIdxKey(pMeta, pChildEntry, pOldColumn, &pTagIdxKey, &tagIdxKeySize);
3,270✔
346
      if (code) {
3,270!
347
        metaErr(TD_VID(pMeta->pVnode), code);
×
348
        taosArrayDestroy(childTables);
×
349
        metaFetchEntryFree(&pChildEntry);
×
350
        return code;
×
351
      }
352

353
      code = tdbTbDelete(pMeta->pTagIdx, pTagIdxKey, tagIdxKeySize, pMeta->txn);
3,270✔
354
      if (code) {
3,270!
355
        metaErr(TD_VID(pMeta->pVnode), code);
×
356
        taosArrayDestroy(childTables);
×
357
        metaFetchEntryFree(&pChildEntry);
×
358
        metaFetchTagIdxKeyFree(&pTagIdxKey);
×
359
        return code;
×
360
      }
361
    }
362

363
    metaFetchTagIdxKeyFree(&pTagIdxKey);
4,990✔
364
    metaFetchEntryFree(&pChildEntry);
4,990✔
365
  }
366

367
  taosArrayDestroy(childTables);
3,158✔
368
  return code;
3,158✔
369
}
370

371
static int32_t metaUpdateSuperTableTagSchema(SMeta *pMeta, const SMetaHandleParam *pParam) {
6,391✔
372
  int32_t               code = TSDB_CODE_SUCCESS;
6,391✔
373
  const SMetaEntry     *pEntry = pParam->pEntry;
6,391✔
374
  const SMetaEntry     *pOldEntry = pParam->pOldEntry;
6,391✔
375
  const SSchemaWrapper *pNewTagSchema = &pEntry->stbEntry.schemaTag;
6,391✔
376
  const SSchemaWrapper *pOldTagSchema = &pOldEntry->stbEntry.schemaTag;
6,391✔
377

378
  int32_t iOld = 0, iNew = 0;
6,391✔
379
  for (; iOld < pOldTagSchema->nCols && iNew < pNewTagSchema->nCols;) {
138,435✔
380
    SSchema *pOldColumn = pOldTagSchema->pSchema + iOld;
132,048✔
381
    SSchema *pNewColumn = pNewTagSchema->pSchema + iNew;
132,048✔
382

383
    if (pOldColumn->colId == pNewColumn->colId) {
132,048✔
384
      code = metaAddOrDropTagIndexOfSuperTable(pMeta, pParam, pOldColumn, pNewColumn);
131,447✔
385
      if (code) {
131,452✔
386
        metaErr(TD_VID(pMeta->pVnode), code);
9!
387
        return code;
×
388
      }
389

390
      iOld++;
131,443✔
391
      iNew++;
131,443✔
392
    } else if (pOldColumn->colId < pNewColumn->colId) {
601!
393
      code = metaAddOrDropTagIndexOfSuperTable(pMeta, pParam, pOldColumn, NULL);
601✔
394
      if (code) {
601!
395
        metaErr(TD_VID(pMeta->pVnode), code);
×
396
        return code;
×
397
      }
398

399
      iOld++;
601✔
400
    } else {
401
      code = metaAddOrDropTagIndexOfSuperTable(pMeta, pParam, NULL, pNewColumn);
×
402
      if (code) {
×
403
        metaErr(TD_VID(pMeta->pVnode), code);
×
404
        return code;
×
405
      }
406

407
      iNew++;
×
408
    }
409
  }
410

411
  for (; iOld < pOldTagSchema->nCols; iOld++) {
6,556✔
412
    SSchema *pOldColumn = pOldTagSchema->pSchema + iOld;
166✔
413
    code = metaAddOrDropTagIndexOfSuperTable(pMeta, pParam, pOldColumn, NULL);
166✔
414
    if (code) {
170✔
415
      metaErr(TD_VID(pMeta->pVnode), code);
1!
416
      return code;
×
417
    }
418
  }
419

420
  for (; iNew < pNewTagSchema->nCols; iNew++) {
7,478✔
421
    SSchema *pNewColumn = pNewTagSchema->pSchema + iNew;
1,088✔
422
    code = metaAddOrDropTagIndexOfSuperTable(pMeta, pParam, NULL, pNewColumn);
1,088✔
423
    if (code) {
1,088!
424
      metaErr(TD_VID(pMeta->pVnode), code);
×
425
      return code;
×
426
    }
427
  }
428

429
  return code;
6,390✔
430
}
431

432
static int32_t metaSchemaTableUpdate(SMeta *pMeta, const SMetaHandleParam *pParam) {
50,973✔
433
  int32_t code = TSDB_CODE_SUCCESS;
50,973✔
434

435
  const SMetaEntry *pEntry = pParam->pEntry;
50,973✔
436
  const SMetaEntry *pOldEntry = pParam->pOldEntry;
50,973✔
437

438
  if (NULL == pOldEntry) {
50,973✔
439
    return metaSchemaTableUpsert(pMeta, pParam, META_TABLE_OP_UPDATA);
41,839✔
440
  }
441

442
  if (pEntry->type == TSDB_NORMAL_TABLE) {
9,134✔
443
    // check row schema
444
    if (pOldEntry->ntbEntry.schemaRow.version != pEntry->ntbEntry.schemaRow.version) {
225✔
445
      return metaSchemaTableUpsert(pMeta, pParam, META_TABLE_OP_UPDATA);
183✔
446
    }
447
  } else if (pEntry->type == TSDB_SUPER_TABLE) {
8,909!
448
    // check row schema
449
    if (pOldEntry->stbEntry.schemaRow.version != pEntry->stbEntry.schemaRow.version) {
9,526✔
450
      return metaSchemaTableUpsert(pMeta, pParam, META_TABLE_OP_UPDATA);
3,128✔
451
    }
452

453
    // check tag schema
454
    code = metaUpdateSuperTableTagSchema(pMeta, pParam);
6,398✔
455
    if (code) {
6,393!
456
      metaErr(TD_VID(pMeta->pVnode), code);
×
457
      return code;
×
458
    }
459

460
  } else {
461
    return TSDB_CODE_INVALID_PARA;
×
462
  }
463

464
  return TSDB_CODE_SUCCESS;
6,438✔
465
}
466

467
static int32_t metaSchemaTableDelete(SMeta *pMeta, const SMetaHandleParam *pEntry) {
×
468
  // TODO
469
  return TSDB_CODE_SUCCESS;
×
470
}
471

472
// Uid Index
473
static void metaBuildEntryInfo(const SMetaEntry *pEntry, SMetaInfo *pInfo) {
266,906✔
474
  pInfo->uid = pEntry->uid;
266,906✔
475
  pInfo->version = pEntry->version;
266,906✔
476
  if (pEntry->type == TSDB_SUPER_TABLE) {
266,906✔
477
    pInfo->suid = pEntry->uid;
37,137✔
478
    pInfo->skmVer = pEntry->stbEntry.schemaRow.version;
37,137✔
479
  } else if (pEntry->type == TSDB_CHILD_TABLE) {
229,769✔
480
    pInfo->suid = pEntry->ctbEntry.suid;
215,493✔
481
    pInfo->skmVer = 0;
215,493✔
482
  } else if (pEntry->type == TSDB_NORMAL_TABLE) {
14,276!
483
    pInfo->suid = 0;
14,450✔
484
    pInfo->skmVer = pEntry->ntbEntry.schemaRow.version;
14,450✔
485
  }
486
}
266,906✔
487

488
static int32_t metaUidIdxUpsert(SMeta *pMeta, const SMetaHandleParam *pParam, EMetaTableOp op) {
266,932✔
489
  int32_t code = TSDB_CODE_SUCCESS;
266,932✔
490
  int32_t vgId = TD_VID(pMeta->pVnode);
266,932✔
491

492
  const SMetaEntry *pEntry = pParam->pEntry;
266,932✔
493

494
  // update cache
495
  SMetaInfo info = {0};
266,932✔
496
  metaBuildEntryInfo(pEntry, &info);
266,932✔
497
  code = metaCacheUpsert(pMeta, &info);
267,077✔
498
  if (code) {
266,931!
499
    metaErr(vgId, code);
×
500
  }
501

502
  // put to tdb
503
  SUidIdxVal value = {
266,843✔
504
      .suid = info.suid,
266,843✔
505
      .skmVer = info.skmVer,
266,843✔
506
      .version = pEntry->version,
266,843✔
507
  };
508
  if (META_TABLE_OP_INSERT == op) {
266,843✔
509
    code = tdbTbInsert(pMeta->pUidIdx, &pEntry->uid, sizeof(pEntry->uid), &value, sizeof(value), pMeta->txn);
256,407✔
510
  } else if (META_TABLE_OP_UPDATA == op) {
10,436!
511
    code = tdbTbUpsert(pMeta->pUidIdx, &pEntry->uid, sizeof(pEntry->uid), &value, sizeof(value), pMeta->txn);
10,444✔
512
  }
513
  return code;
267,141✔
514
}
515

516
static int32_t metaUidIdxInsert(SMeta *pMeta, const SMetaHandleParam *pParam) {
256,475✔
517
  return metaUidIdxUpsert(pMeta, pParam, META_TABLE_OP_INSERT);
256,475✔
518
}
519

520
static int32_t metaUidIdxUpdate(SMeta *pMeta, const SMetaHandleParam *pParam) {
10,434✔
521
  return metaUidIdxUpsert(pMeta, pParam, META_TABLE_OP_UPDATA);
10,434✔
522
}
523

524
static int32_t metaUidIdxDelete(SMeta *pMeta, const SMetaHandleParam *pParam) {
8,481✔
525
  int32_t code = 0;
8,481✔
526

527
  const SMetaEntry *pEntry = pParam->pOldEntry;
8,481✔
528

529
  // delete tdb
530
  code = tdbTbDelete(pMeta->pUidIdx, &pEntry->uid, sizeof(pEntry->uid), pMeta->txn);
8,481✔
531
  if (code) {
8,488!
532
    metaErr(TD_VID(pMeta->pVnode), code);
×
533
  }
534

535
  // delete cache
536
  (void)metaCacheDrop(pMeta, pEntry->uid);
8,488✔
537
  return code;
8,485✔
538
}
539

540
// Name Index
541
static int32_t metaNameIdxUpsert(SMeta *pMeta, const SMetaHandleParam *pParam, EMetaTableOp op) {
256,520✔
542
  int32_t code = TSDB_CODE_SUCCESS;
256,520✔
543

544
  const SMetaEntry *pEntry = pParam->pEntry;
256,520✔
545

546
  if (META_TABLE_OP_INSERT == op) {
256,520!
547
    code = tdbTbInsert(pMeta->pNameIdx, pEntry->name, strlen(pEntry->name) + 1, &pEntry->uid, sizeof(pEntry->uid),
256,577✔
548
                       pMeta->txn);
549
  } else if (META_TABLE_OP_UPDATA == op) {
×
550
    code = tdbTbUpsert(pMeta->pNameIdx, pEntry->name, strlen(pEntry->name) + 1, &pEntry->uid, sizeof(pEntry->uid),
×
551
                       pMeta->txn);
552
  } else {
553
    code = TSDB_CODE_INVALID_PARA;
×
554
  }
555
  return code;
256,682✔
556
}
557

558
static int32_t metaNameIdxInsert(SMeta *pMeta, const SMetaHandleParam *pParam) {
256,557✔
559
  int32_t code = TSDB_CODE_SUCCESS;
256,557✔
560
  return metaNameIdxUpsert(pMeta, pParam, META_TABLE_OP_INSERT);
256,557✔
561
}
562

563
static int32_t metaNameIdxUpdate(SMeta *pMeta, const SMetaHandleParam *pParam) {
×
564
  return metaNameIdxUpsert(pMeta, pParam, META_TABLE_OP_UPDATA);
×
565
}
566

567
static int32_t metaNameIdxDelete(SMeta *pMeta, const SMetaHandleParam *pParam) {
8,484✔
568
  int32_t code = TSDB_CODE_SUCCESS;
8,484✔
569

570
  const SMetaEntry *pEntry = pParam->pOldEntry;
8,484✔
571
  code = tdbTbDelete(pMeta->pNameIdx, pEntry->name, strlen(pEntry->name) + 1, pMeta->txn);
8,484✔
572
  if (code) {
8,491!
573
    metaErr(TD_VID(pMeta->pVnode), code);
×
574
  }
575
  return code;
8,491✔
576
}
577

578
// Suid Index
579
static int32_t metaSUidIdxInsert(SMeta *pMeta, const SMetaHandleParam *pParam) {
27,545✔
580
  const SMetaEntry *pEntry = pParam->pEntry;
27,545✔
581

582
  int32_t code = tdbTbInsert(pMeta->pSuidIdx, &pEntry->uid, sizeof(pEntry->uid), NULL, 0, pMeta->txn);
27,545✔
583
  if (code) {
27,646!
584
    metaErr(TD_VID(pMeta->pVnode), code);
×
585
  }
586
  return code;
27,596✔
587
}
588

589
static int32_t metaSUidIdxDelete(SMeta *pMeta, const SMetaHandleParam *pParam) {
2,299✔
590
  const SMetaEntry *pEntry = pParam->pOldEntry;
2,299✔
591

592
  int32_t code = tdbTbDelete(pMeta->pSuidIdx, &pEntry->uid, sizeof(pEntry->uid), pMeta->txn);
2,299✔
593
  if (code) {
2,300!
594
    metaErr(TD_VID(pMeta->pVnode), code);
×
595
  }
596
  return code;
2,299✔
597
}
598

599
// Child Index
600
static int32_t metaChildIdxUpsert(SMeta *pMeta, const SMetaHandleParam *pParam, EMetaTableOp op) {
215,272✔
601
  int32_t code = TSDB_CODE_SUCCESS;
215,272✔
602

603
  const SMetaEntry *pEntry = pParam->pEntry;
215,272✔
604

605
  SCtbIdxKey key = {
215,272✔
606
      .suid = pEntry->ctbEntry.suid,
215,272✔
607
      .uid = pEntry->uid,
215,272✔
608
  };
609

610
  if (META_TABLE_OP_INSERT == op) {
215,272✔
611
    code = tdbTbInsert(pMeta->pCtbIdx, &key, sizeof(key), pEntry->ctbEntry.pTags,
214,809✔
612
                       ((STag *)(pEntry->ctbEntry.pTags))->len, pMeta->txn);
214,809✔
613
  } else if (META_TABLE_OP_UPDATA == op) {
463!
614
    code = tdbTbUpsert(pMeta->pCtbIdx, &key, sizeof(key), pEntry->ctbEntry.pTags,
470✔
615
                       ((STag *)(pEntry->ctbEntry.pTags))->len, pMeta->txn);
470✔
616
  } else {
617
    code = TSDB_CODE_INVALID_PARA;
×
618
  }
619
  return code;
215,285✔
620
}
621

622
static int32_t metaChildIdxInsert(SMeta *pMeta, const SMetaHandleParam *pParam) {
214,796✔
623
  return metaChildIdxUpsert(pMeta, pParam, META_TABLE_OP_INSERT);
214,796✔
624
}
625

626
static int32_t metaChildIdxUpdate(SMeta *pMeta, const SMetaHandleParam *pParam) {
691✔
627
  const SMetaEntry *pEntry = pParam->pEntry;
691✔
628
  const SMetaEntry *pOldEntry = pParam->pOldEntry;
691✔
629
  const SMetaEntry *pSuperEntry = pParam->pSuperEntry;
691✔
630

631
  const STag *pNewTags = (const STag *)pEntry->ctbEntry.pTags;
691✔
632
  const STag *pOldTags = (const STag *)pOldEntry->ctbEntry.pTags;
691✔
633
  if (pNewTags->len != pOldTags->len || memcmp(pNewTags, pOldTags, pNewTags->len)) {
691✔
634
    return metaChildIdxUpsert(pMeta, pParam, META_TABLE_OP_UPDATA);
470✔
635
  }
636
  return 0;
221✔
637
}
638

639
static int32_t metaChildIdxDelete(SMeta *pMeta, const SMetaHandleParam *pParam) {
4,405✔
640
  const SMetaEntry *pEntry = pParam->pOldEntry;
4,405✔
641

642
  SCtbIdxKey key = {
4,405✔
643
      .suid = pEntry->ctbEntry.suid,
4,405✔
644
      .uid = pEntry->uid,
4,405✔
645
  };
646
  return tdbTbDelete(pMeta->pCtbIdx, &key, sizeof(key), pMeta->txn);
4,405✔
647
}
648

649
// Tag Index
650
static int32_t metaFetchTagIdxKey(SMeta *pMeta, const SMetaEntry *pEntry, const SSchema *pTagColumn,
224,889✔
651
                                  STagIdxKey **ppTagIdxKey, int32_t *pTagIdxKeySize) {
652
  int32_t code = TSDB_CODE_SUCCESS;
224,889✔
653

654
  STagIdxKey *pTagIdxKey = NULL;
224,889✔
655
  int32_t     nTagIdxKey;
656
  const void *pTagData = NULL;
224,889✔
657
  int32_t     nTagData = 0;
224,889✔
658

659
  STagVal tagVal = {
224,889✔
660
      .cid = pTagColumn->colId,
224,889✔
661
  };
662

663
  if (tTagGet((const STag *)pEntry->ctbEntry.pTags, &tagVal)) {
224,889✔
664
    if (IS_VAR_DATA_TYPE(pTagColumn->type)) {
224,414!
665
      pTagData = tagVal.pData;
22,906✔
666
      nTagData = (int32_t)tagVal.nData;
22,906✔
667
    } else {
668
      pTagData = &(tagVal.i64);
201,508✔
669
      nTagData = tDataTypes[pTagColumn->type].bytes;
201,508✔
670
    }
671
  } else {
672
    if (!IS_VAR_DATA_TYPE(pTagColumn->type)) {
446!
673
      nTagData = tDataTypes[pTagColumn->type].bytes;
249✔
674
    }
675
  }
676

677
  code = metaCreateTagIdxKey(pEntry->ctbEntry.suid, pTagColumn->colId, pTagData, nTagData, pTagColumn->type,
224,860✔
678
                             pEntry->uid, &pTagIdxKey, &nTagIdxKey);
224,860✔
679
  if (code) {
224,866✔
680
    metaErr(TD_VID(pMeta->pVnode), code);
11!
681
    return code;
×
682
  }
683

684
  *ppTagIdxKey = pTagIdxKey;
224,855✔
685
  *pTagIdxKeySize = nTagIdxKey;
224,855✔
686
  return code;
224,855✔
687
}
688

689
static void metaFetchTagIdxKeyFree(STagIdxKey **ppTagIdxKey) {
224,911✔
690
  metaDestroyTagIdxKey(*ppTagIdxKey);
224,911✔
691
  *ppTagIdxKey = NULL;
224,900✔
692
}
224,900✔
693

694
static int32_t metaTagIdxInsert(SMeta *pMeta, const SMetaHandleParam *pParam) {
214,801✔
695
  int32_t code = TSDB_CODE_SUCCESS;
214,801✔
696

697
  const SMetaEntry *pEntry = pParam->pEntry;
214,801✔
698
  const SMetaEntry *pSuperEntry = pParam->pSuperEntry;
214,801✔
699

700
  const SSchemaWrapper *pTagSchema = &pSuperEntry->stbEntry.schemaTag;
214,801✔
701
  if (pTagSchema->nCols == 1 && pTagSchema->pSchema[0].type == TSDB_DATA_TYPE_JSON) {
214,984✔
702
    const SSchema *pTagColumn = &pTagSchema->pSchema[0];
183✔
703

704
    STagVal tagVal = {
183✔
705
        .cid = pTagColumn->colId,
183✔
706
    };
707

708
    const void *pTagData = pEntry->ctbEntry.pTags;
183✔
709
    int32_t     nTagData = ((const STag *)pEntry->ctbEntry.pTags)->len;
183✔
710
    code = metaSaveJsonVarToIdx(pMeta, pEntry, pTagColumn);
183✔
711
    if (code) {
183!
712
      metaErr(TD_VID(pMeta->pVnode), code);
×
713
    }
714
  } else {
715
    for (int32_t i = 0; i < pTagSchema->nCols; i++) {
746,399✔
716
      STagIdxKey    *pTagIdxKey = NULL;
531,790✔
717
      int32_t        nTagIdxKey;
718
      const SSchema *pTagColumn = &pTagSchema->pSchema[i];
531,790✔
719

720
      if (!IS_IDX_ON(pTagColumn)) {
531,790✔
721
        continue;
317,204✔
722
      }
723

724
      code = metaFetchTagIdxKey(pMeta, pEntry, pTagColumn, &pTagIdxKey, &nTagIdxKey);
214,586✔
725
      if (code) {
214,537!
726
        metaErr(TD_VID(pMeta->pVnode), code);
×
727
        return code;
×
728
      }
729

730
      code = tdbTbInsert(pMeta->pTagIdx, pTagIdxKey, nTagIdxKey, NULL, 0, pMeta->txn);
214,537✔
731
      if (code) {
214,593!
732
        metaErr(TD_VID(pMeta->pVnode), code);
×
733
        metaFetchTagIdxKeyFree(&pTagIdxKey);
×
734
        return code;
×
735
      }
736
      metaFetchTagIdxKeyFree(&pTagIdxKey);
214,593✔
737
    }
738
  }
739
  return code;
214,792✔
740
}
741

742
static int32_t metaTagIdxUpdate(SMeta *pMeta, const SMetaHandleParam *pParam) {
691✔
743
  int32_t code = TSDB_CODE_SUCCESS;
691✔
744

745
  const SMetaEntry     *pEntry = pParam->pEntry;
691✔
746
  const SMetaEntry     *pOldEntry = pParam->pOldEntry;
691✔
747
  const SMetaEntry     *pSuperEntry = pParam->pSuperEntry;
691✔
748
  const SSchemaWrapper *pTagSchema = &pSuperEntry->stbEntry.schemaTag;
691✔
749
  const STag           *pNewTags = (const STag *)pEntry->ctbEntry.pTags;
691✔
750
  const STag           *pOldTags = (const STag *)pOldEntry->ctbEntry.pTags;
691✔
751

752
  if (pNewTags->len == pOldTags->len && !memcmp(pNewTags, pOldTags, pNewTags->len)) {
691✔
753
    return code;
221✔
754
  }
755

756
  if (pTagSchema->nCols == 1 && pTagSchema->pSchema[0].type == TSDB_DATA_TYPE_JSON) {
470✔
757
    code = metaDelJsonVarFromIdx(pMeta, pOldEntry, &pTagSchema->pSchema[0]);
8✔
758
    if (code) {
8!
759
      metaErr(TD_VID(pMeta->pVnode), code);
×
760
      return code;
×
761
    }
762

763
    code = metaSaveJsonVarToIdx(pMeta, pEntry, &pTagSchema->pSchema[0]);
8✔
764
    if (code) {
8!
765
      metaErr(TD_VID(pMeta->pVnode), code);
×
766
      return code;
×
767
    }
768
  } else {
769
    for (int32_t i = 0; i < pTagSchema->nCols; i++) {
2,342✔
770
      const SSchema *pTagColumn = &pTagSchema->pSchema[i];
1,880✔
771

772
      if (!IS_IDX_ON(pTagColumn)) {
1,880✔
773
        continue;
1,421✔
774
      }
775

776
      STagIdxKey *pOldTagIdxKey = NULL;
459✔
777
      int32_t     oldTagIdxKeySize = 0;
459✔
778
      STagIdxKey *pNewTagIdxKey = NULL;
459✔
779
      int32_t     newTagIdxKeySize = 0;
459✔
780

781
      code = metaFetchTagIdxKey(pMeta, pOldEntry, pTagColumn, &pOldTagIdxKey, &oldTagIdxKeySize);
459✔
782
      if (code) {
459!
783
        metaErr(TD_VID(pMeta->pVnode), code);
×
784
        return code;
×
785
      }
786

787
      code = metaFetchTagIdxKey(pMeta, pEntry, pTagColumn, &pNewTagIdxKey, &newTagIdxKeySize);
459✔
788
      if (code) {
459!
789
        metaErr(TD_VID(pMeta->pVnode), code);
×
790
        metaFetchTagIdxKeyFree(&pOldTagIdxKey);
×
791
        return code;
×
792
      }
793

794
      if (tagIdxKeyCmpr(pOldTagIdxKey, oldTagIdxKeySize, pNewTagIdxKey, newTagIdxKeySize)) {
459✔
795
        code = tdbTbDelete(pMeta->pTagIdx, pOldTagIdxKey, oldTagIdxKeySize, pMeta->txn);
93✔
796
        if (code) {
93!
797
          metaErr(TD_VID(pMeta->pVnode), code);
×
798
          metaFetchTagIdxKeyFree(&pOldTagIdxKey);
×
799
          metaFetchTagIdxKeyFree(&pNewTagIdxKey);
×
800
          return code;
×
801
        }
802

803
        code = tdbTbInsert(pMeta->pTagIdx, pNewTagIdxKey, newTagIdxKeySize, NULL, 0, pMeta->txn);
93✔
804
        if (code) {
93!
805
          metaErr(TD_VID(pMeta->pVnode), code);
×
806
          metaFetchTagIdxKeyFree(&pOldTagIdxKey);
×
807
          metaFetchTagIdxKeyFree(&pNewTagIdxKey);
×
808
          return code;
×
809
        }
810
      }
811

812
      metaFetchTagIdxKeyFree(&pOldTagIdxKey);
459✔
813
      metaFetchTagIdxKeyFree(&pNewTagIdxKey);
459✔
814
    }
815
  }
816
  return code;
470✔
817
}
818

819
static int32_t metaTagIdxDelete(SMeta *pMeta, const SMetaHandleParam *pParam) {
4,408✔
820
  int32_t code = TSDB_CODE_SUCCESS;
4,408✔
821

822
  const SMetaEntry     *pEntry = pParam->pEntry;
4,408✔
823
  const SMetaEntry     *pChild = pParam->pOldEntry;
4,408✔
824
  const SMetaEntry     *pSuper = pParam->pSuperEntry;
4,408✔
825
  const SSchemaWrapper *pTagSchema = &pSuper->stbEntry.schemaTag;
4,408✔
826
  const SSchema        *pTagColumn = NULL;
4,408✔
827
  const STag           *pTags = (const STag *)pChild->ctbEntry.pTags;
4,408✔
828

829
  if (pTagSchema->nCols == 1 && pTagSchema->pSchema[0].type == TSDB_DATA_TYPE_JSON) {
4,408✔
830
    pTagColumn = &pTagSchema->pSchema[0];
8✔
831
    code = metaDelJsonVarFromIdx(pMeta, pChild, pTagColumn);
8✔
832
    if (code) {
8!
833
      metaErr(TD_VID(pMeta->pVnode), code);
×
834
    }
835
  } else {
836
    for (int32_t i = 0; i < pTagSchema->nCols; i++) {
29,740✔
837
      pTagColumn = &pTagSchema->pSchema[i];
25,339✔
838
      if (!IS_IDX_ON(pTagColumn)) {
25,339✔
839
        continue;
20,928✔
840
      }
841

842
      STagIdxKey *pTagIdxKey = NULL;
4,411✔
843
      int32_t     nTagIdxKey;
844

845
      code = metaFetchTagIdxKey(pMeta, pChild, pTagColumn, &pTagIdxKey, &nTagIdxKey);
4,411✔
846
      if (code) {
4,406!
847
        metaErr(TD_VID(pMeta->pVnode), code);
×
848
        return code;
×
849
      }
850

851
      code = tdbTbDelete(pMeta->pTagIdx, pTagIdxKey, nTagIdxKey, pMeta->txn);
4,406✔
852
      if (code) {
4,413!
853
        metaErr(TD_VID(pMeta->pVnode), code);
×
854
        metaFetchTagIdxKeyFree(&pTagIdxKey);
×
855
        return code;
×
856
      }
857
      metaFetchTagIdxKeyFree(&pTagIdxKey);
4,413✔
858
    }
859
  }
860
  return code;
4,409✔
861
}
862

863
// Btime Index
864
static int32_t metaBtimeIdxUpsert(SMeta *pMeta, const SMetaHandleParam *pParam, EMetaTableOp op) {
235,197✔
865
  int32_t code = TSDB_CODE_SUCCESS;
235,197✔
866

867
  const SMetaEntry *pEntry;
868
  if (META_TABLE_OP_DELETE == op) {
235,197✔
869
    pEntry = pParam->pOldEntry;
6,187✔
870
  } else {
871
    pEntry = pParam->pEntry;
229,010✔
872
  }
873

874
  SBtimeIdxKey key = {
235,197✔
875
      .uid = pEntry->uid,
235,197✔
876
  };
877

878
  if (TSDB_CHILD_TABLE == pEntry->type) {
235,197✔
879
    key.btime = pEntry->ctbEntry.btime;
219,208✔
880
  } else if (TSDB_NORMAL_TABLE == pEntry->type) {
15,989!
881
    key.btime = pEntry->ntbEntry.btime;
16,008✔
882
  } else {
883
    return TSDB_CODE_INVALID_PARA;
×
884
  }
885

886
  if (META_TABLE_OP_INSERT == op) {
235,216✔
887
    code = tdbTbInsert(pMeta->pBtimeIdx, &key, sizeof(key), NULL, 0, pMeta->txn);
229,027✔
888
  } else if (META_TABLE_OP_UPDATA == op) {
6,189!
889
    code = tdbTbUpsert(pMeta->pBtimeIdx, &key, sizeof(key), NULL, 0, pMeta->txn);
×
890
  } else if (META_TABLE_OP_DELETE == op) {
6,189!
891
    code = tdbTbDelete(pMeta->pBtimeIdx, &key, sizeof(key), pMeta->txn);
6,189✔
892
  } else {
893
    code = TSDB_CODE_INVALID_PARA;
×
894
  }
895
  if (code) {
235,235!
896
    metaErr(TD_VID(pMeta->pVnode), code);
×
897
  }
898
  return code;
235,233✔
899
}
900

901
static int32_t metaBtimeIdxInsert(SMeta *pMeta, const SMetaHandleParam *pParam) {
229,014✔
902
  return metaBtimeIdxUpsert(pMeta, pParam, META_TABLE_OP_INSERT);
229,014✔
903
}
904

905
static int32_t metaBtimeIdxUpdate(SMeta *pMeta, const SMetaHandleParam *pParam) {
×
906
  return metaBtimeIdxUpsert(pMeta, pParam, META_TABLE_OP_UPDATA);
×
907
}
908

909
static int32_t metaBtimeIdxDelete(SMeta *pMeta, const SMetaHandleParam *pParam) {
6,186✔
910
  return metaBtimeIdxUpsert(pMeta, pParam, META_TABLE_OP_DELETE);
6,186✔
911
}
912

913
// TTL Index
914
static int32_t metaTtlIdxUpsert(SMeta *pMeta, const SMetaHandleParam *pParam, EMetaTableOp op) {
229,051✔
915
  const SMetaEntry *pEntry = pParam->pEntry;
229,051✔
916

917
  STtlUpdTtlCtx ctx = {
229,051✔
918
      .uid = pEntry->uid,
229,051✔
919
      .pTxn = pMeta->txn,
229,051✔
920
  };
921
  if (TSDB_CHILD_TABLE == pEntry->type) {
229,051✔
922
    ctx.ttlDays = pEntry->ctbEntry.ttlDays;
214,823✔
923
    ctx.changeTimeMs = pEntry->ctbEntry.btime;
214,823✔
924
  } else if (TSDB_NORMAL_TABLE == pEntry->type) {
14,228!
925
    ctx.ttlDays = pEntry->ntbEntry.ttlDays;
14,236✔
926
    ctx.changeTimeMs = pEntry->ntbEntry.btime;
14,236✔
927
  } else {
928
    return TSDB_CODE_INVALID_PARA;
×
929
  }
930

931
  int32_t ret = ttlMgrInsertTtl(pMeta->pTtlMgr, &ctx);
229,059✔
932
  if (ret < 0) {
229,044!
933
    metaError("vgId:%d, failed to insert ttl, uid: %" PRId64 " %s", TD_VID(pMeta->pVnode), pEntry->uid, tstrerror(ret));
×
934
  }
935
  return TSDB_CODE_SUCCESS;
229,047✔
936
}
937

938
static int32_t metaTtlIdxInsert(SMeta *pMeta, const SMetaHandleParam *pParam) {
229,058✔
939
  return metaTtlIdxUpsert(pMeta, pParam, META_TABLE_OP_INSERT);
229,058✔
940
}
941

942
static int32_t metaTtlIdxDelete(SMeta *pMeta, const SMetaHandleParam *pParam);
943

944
static int32_t metaTtlIdxUpdate(SMeta *pMeta, const SMetaHandleParam *pParam) {
916✔
945
  int32_t code = TSDB_CODE_SUCCESS;
916✔
946

947
  const SMetaEntry *pEntry = pParam->pEntry;
916✔
948
  const SMetaEntry *pOldEntry = pParam->pOldEntry;
916✔
949

950
  if ((pEntry->type == TSDB_CHILD_TABLE && pOldEntry->ctbEntry.ttlDays != pEntry->ctbEntry.ttlDays) ||
916✔
951
      (pEntry->type == TSDB_NORMAL_TABLE && pOldEntry->ntbEntry.ttlDays != pEntry->ntbEntry.ttlDays)) {
901✔
952
    code = metaTtlIdxDelete(pMeta, pParam);
26✔
953
    if (code) {
26!
954
      metaErr(TD_VID(pMeta->pVnode), code);
×
955
    }
956

957
    code = metaTtlIdxInsert(pMeta, pParam);
26✔
958
    if (code) {
26!
959
      metaErr(TD_VID(pMeta->pVnode), code);
×
960
    }
961
  }
962

963
  return TSDB_CODE_SUCCESS;
916✔
964
}
965

966
static int32_t metaTtlIdxDelete(SMeta *pMeta, const SMetaHandleParam *pParam) {
6,212✔
967
  int32_t code = TSDB_CODE_SUCCESS;
6,212✔
968

969
  const SMetaEntry *pEntry = pParam->pOldEntry;
6,212✔
970
  STtlDelTtlCtx     ctx = {
6,212✔
971
          .uid = pEntry->uid,
6,212✔
972
          .pTxn = pMeta->txn,
6,212✔
973
  };
974

975
  if (TSDB_CHILD_TABLE == pEntry->type) {
6,212✔
976
    ctx.ttlDays = pEntry->ctbEntry.ttlDays;
4,419✔
977
  } else if (TSDB_NORMAL_TABLE == pEntry->type) {
1,793!
978
    ctx.ttlDays = pEntry->ntbEntry.ttlDays;
1,794✔
979
  } else {
980
    code = TSDB_CODE_INVALID_PARA;
×
981
  }
982

983
  if (TSDB_CODE_SUCCESS == code) {
6,212!
984
    int32_t ret = ttlMgrDeleteTtl(pMeta->pTtlMgr, &ctx);
6,213✔
985
    if (ret < 0) {
6,213!
986
      metaError("vgId:%d, failed to delete ttl, uid: %" PRId64 " %s", TD_VID(pMeta->pVnode), pEntry->uid,
×
987
                tstrerror(ret));
988
    }
989
  }
990
  return code;
6,213✔
991
}
992

993
static int32_t (*metaTableOpFn[META_TABLE_MAX][META_TABLE_OP_MAX])(SMeta *pMeta, const SMetaHandleParam *pParam) =
994
    {
995
        [META_ENTRY_TABLE] =
996
            {
997
                [META_TABLE_OP_INSERT] = metaEntryTableInsert,
998
                [META_TABLE_OP_UPDATA] = metaEntryTableUpdate,
999
                [META_TABLE_OP_DELETE] = metaEntryTableDelete,
1000
            },
1001
        [META_SCHEMA_TABLE] =
1002
            {
1003
                [META_TABLE_OP_INSERT] = metaSchemaTableInsert,
1004
                [META_TABLE_OP_UPDATA] = metaSchemaTableUpdate,
1005
                [META_TABLE_OP_DELETE] = metaSchemaTableDelete,
1006
            },
1007
        [META_UID_IDX] =
1008
            {
1009
                [META_TABLE_OP_INSERT] = metaUidIdxInsert,
1010
                [META_TABLE_OP_UPDATA] = metaUidIdxUpdate,
1011
                [META_TABLE_OP_DELETE] = metaUidIdxDelete,
1012
            },
1013
        [META_NAME_IDX] =
1014
            {
1015
                [META_TABLE_OP_INSERT] = metaNameIdxInsert,
1016
                [META_TABLE_OP_UPDATA] = metaNameIdxUpdate,
1017
                [META_TABLE_OP_DELETE] = metaNameIdxDelete,
1018
            },
1019
        [META_SUID_IDX] =
1020
            {
1021
                [META_TABLE_OP_INSERT] = metaSUidIdxInsert,
1022
                [META_TABLE_OP_UPDATA] = NULL,
1023
                [META_TABLE_OP_DELETE] = metaSUidIdxDelete,
1024
            },
1025
        [META_CHILD_IDX] =
1026
            {
1027
                [META_TABLE_OP_INSERT] = metaChildIdxInsert,
1028
                [META_TABLE_OP_UPDATA] = metaChildIdxUpdate,
1029
                [META_TABLE_OP_DELETE] = metaChildIdxDelete,
1030
            },
1031
        [META_TAG_IDX] =
1032
            {
1033
                [META_TABLE_OP_INSERT] = metaTagIdxInsert,
1034
                [META_TABLE_OP_UPDATA] = metaTagIdxUpdate,
1035
                [META_TABLE_OP_DELETE] = metaTagIdxDelete,
1036
            },
1037
        [META_BTIME_IDX] =
1038
            {
1039
                [META_TABLE_OP_INSERT] = metaBtimeIdxInsert,
1040
                [META_TABLE_OP_UPDATA] = metaBtimeIdxUpdate,
1041
                [META_TABLE_OP_DELETE] = metaBtimeIdxDelete,
1042
            },
1043
        [META_TTL_IDX] =
1044
            {
1045
                [META_TABLE_OP_INSERT] = metaTtlIdxInsert,
1046
                [META_TABLE_OP_UPDATA] = metaTtlIdxUpdate,
1047
                [META_TABLE_OP_DELETE] = metaTtlIdxDelete,
1048
            },
1049
};
1050

1051
static int32_t metaHandleSuperTableCreateImpl(SMeta *pMeta, const SMetaEntry *pEntry) {
27,544✔
1052
  int32_t code = TSDB_CODE_SUCCESS;
27,544✔
1053

1054
  SMetaTableOp ops[] = {
27,544✔
1055
      {META_ENTRY_TABLE, META_TABLE_OP_INSERT},   //
1056
      {META_SCHEMA_TABLE, META_TABLE_OP_UPDATA},  // TODO: here should be insert
1057
      {META_UID_IDX, META_TABLE_OP_INSERT},       //
1058
      {META_NAME_IDX, META_TABLE_OP_INSERT},      //
1059
      {META_SUID_IDX, META_TABLE_OP_INSERT},      //
1060
  };
1061

1062
  for (int i = 0; i < sizeof(ops) / sizeof(ops[0]); i++) {
165,350✔
1063
    SMetaTableOp          *op = &ops[i];
137,810✔
1064
    const SMetaHandleParam param = {
137,810✔
1065
        .pEntry = pEntry,
1066
    };
1067

1068
    code = metaTableOpFn[op->table][op->op](pMeta, &param);
137,810✔
1069
    if (TSDB_CODE_SUCCESS != code) {
137,692!
1070
      metaErr(TD_VID(pMeta->pVnode), code);
×
1071
      return code;
×
1072
    }
1073
  }
1074

1075
  return code;
27,540✔
1076
}
1077
static int32_t metaHandleSuperTableCreate(SMeta *pMeta, const SMetaEntry *pEntry) {
27,591✔
1078
  int32_t code = TSDB_CODE_SUCCESS;
27,591✔
1079

1080
  metaWLock(pMeta);
27,591✔
1081
  code = metaHandleSuperTableCreateImpl(pMeta, pEntry);
27,636✔
1082
  metaULock(pMeta);
27,583✔
1083

1084
  if (TSDB_CODE_SUCCESS == code) {
27,652!
1085
    pMeta->pVnode->config.vndStats.numOfSTables++;
27,652✔
1086

1087
    metaInfo("vgId:%d, %s success, version:%" PRId64 " type:%d uid:%" PRId64 " name:%s", TD_VID(pMeta->pVnode),
27,652✔
1088
             __func__, pEntry->version, pEntry->type, pEntry->uid, pEntry->name);
1089
  } else {
1090
    metaErr(TD_VID(pMeta->pVnode), code);
×
1091
  }
1092
  return code;
27,679✔
1093
}
1094

1095
static int32_t metaHandleNormalTableCreateImpl(SMeta *pMeta, const SMetaEntry *pEntry) {
14,225✔
1096
  int32_t code = TSDB_CODE_SUCCESS;
14,225✔
1097

1098
  SMetaTableOp ops[] = {
14,225✔
1099
      {META_ENTRY_TABLE, META_TABLE_OP_INSERT},   //
1100
      {META_SCHEMA_TABLE, META_TABLE_OP_UPDATA},  // TODO: need to be insert
1101
      {META_UID_IDX, META_TABLE_OP_INSERT},       //
1102
      {META_NAME_IDX, META_TABLE_OP_INSERT},      //
1103
      {META_BTIME_IDX, META_TABLE_OP_INSERT},     //
1104
      {META_TTL_IDX, META_TABLE_OP_INSERT},       //
1105
  };
1106

1107
  for (int i = 0; i < sizeof(ops) / sizeof(ops[0]); i++) {
99,570✔
1108
    SMetaTableOp *op = &ops[i];
85,343✔
1109

1110
    SMetaHandleParam param = {
85,343✔
1111
        .pEntry = pEntry,
1112
    };
1113

1114
    code = metaTableOpFn[op->table][op->op](pMeta, &param);
85,343✔
1115
    if (TSDB_CODE_SUCCESS != code) {
85,344!
1116
      metaErr(TD_VID(pMeta->pVnode), code);
×
1117
      return code;
×
1118
    }
1119
  }
1120

1121
  return code;
14,227✔
1122
}
1123
static int32_t metaHandleNormalTableCreate(SMeta *pMeta, const SMetaEntry *pEntry) {
14,225✔
1124
  int32_t code = TSDB_CODE_SUCCESS;
14,225✔
1125

1126
  // update TDB
1127
  metaWLock(pMeta);
14,225✔
1128
  code = metaHandleNormalTableCreateImpl(pMeta, pEntry);
14,225✔
1129
  metaULock(pMeta);
14,224✔
1130

1131
  // update other stuff
1132
  if (TSDB_CODE_SUCCESS == code) {
14,225!
1133
    pMeta->pVnode->config.vndStats.numOfNTables++;
14,225✔
1134
    pMeta->pVnode->config.vndStats.numOfNTimeSeries += pEntry->ntbEntry.schemaRow.nCols - 1;
14,225✔
1135

1136
    if (!TSDB_CACHE_NO(pMeta->pVnode->config)) {
14,225✔
1137
      int32_t rc = tsdbCacheNewTable(pMeta->pVnode->pTsdb, pEntry->uid, -1, &pEntry->ntbEntry.schemaRow);
30✔
1138
      if (rc < 0) {
30!
1139
        metaError("vgId:%d, failed to create table:%s since %s", TD_VID(pMeta->pVnode), pEntry->name, tstrerror(rc));
×
1140
      }
1141
    }
1142
  } else {
1143
    metaErr(TD_VID(pMeta->pVnode), code);
×
1144
  }
1145
  return code;
14,225✔
1146
}
1147

1148
static int32_t metaHandleChildTableCreateImpl(SMeta *pMeta, const SMetaEntry *pEntry, const SMetaEntry *pSuperEntry) {
214,818✔
1149
  int32_t code = TSDB_CODE_SUCCESS;
214,818✔
1150

1151
  SMetaTableOp ops[] = {
214,818✔
1152
      {META_ENTRY_TABLE, META_TABLE_OP_INSERT},  //
1153
      {META_UID_IDX, META_TABLE_OP_INSERT},      //
1154
      {META_NAME_IDX, META_TABLE_OP_INSERT},     //
1155
      {META_CHILD_IDX, META_TABLE_OP_INSERT},    //
1156
      {META_TAG_IDX, META_TABLE_OP_INSERT},      //
1157
      {META_BTIME_IDX, META_TABLE_OP_INSERT},    //
1158
      {META_TTL_IDX, META_TABLE_OP_INSERT},      //
1159
  };
1160

1161
  for (int i = 0; i < sizeof(ops) / sizeof(ops[0]); i++) {
1,717,325✔
1162
    SMetaTableOp *op = &ops[i];
1,502,827✔
1163

1164
    SMetaHandleParam param = {
1,502,827✔
1165
        .pEntry = pEntry,
1166
        .pSuperEntry = pSuperEntry,
1167
    };
1168

1169
    code = metaTableOpFn[op->table][op->op](pMeta, &param);
1,502,827✔
1170
    if (TSDB_CODE_SUCCESS != code) {
1,502,498!
1171
      metaErr(TD_VID(pMeta->pVnode), code);
×
1172
      return code;
×
1173
    }
1174
  }
1175

1176
  if (TSDB_CODE_SUCCESS == code) {
214,498!
1177
    metaUpdateStbStats(pMeta, pSuperEntry->uid, 1, 0);
214,797✔
1178
    int32_t ret = metaUidCacheClear(pMeta, pSuperEntry->uid);
214,810✔
1179
    if (ret < 0) {
214,830!
1180
      metaErr(TD_VID(pMeta->pVnode), ret);
×
1181
    }
1182

1183
    ret = metaTbGroupCacheClear(pMeta, pSuperEntry->uid);
214,830✔
1184
    if (ret < 0) {
214,826!
1185
      metaErr(TD_VID(pMeta->pVnode), ret);
×
1186
    }
1187
  }
1188
  return code;
214,811✔
1189
}
1190

1191
static int32_t metaHandleChildTableCreate(SMeta *pMeta, const SMetaEntry *pEntry) {
214,810✔
1192
  int32_t     code = TSDB_CODE_SUCCESS;
214,810✔
1193
  SMetaEntry *pSuperEntry = NULL;
214,810✔
1194

1195
  // get the super table entry
1196
  code = metaFetchEntryByUid(pMeta, pEntry->ctbEntry.suid, &pSuperEntry);
214,810✔
1197
  if (code) {
214,831!
1198
    metaErr(TD_VID(pMeta->pVnode), code);
×
1199
    return code;
×
1200
  }
1201

1202
  // update TDB
1203
  metaWLock(pMeta);
214,831✔
1204
  code = metaHandleChildTableCreateImpl(pMeta, pEntry, pSuperEntry);
214,837✔
1205
  metaULock(pMeta);
214,805✔
1206

1207
  // update other stuff
1208
  if (TSDB_CODE_SUCCESS == code) {
214,822!
1209
    pMeta->pVnode->config.vndStats.numOfCTables++;
214,822✔
1210

1211
    if (!metaTbInFilterCache(pMeta, pSuperEntry->name, 1)) {
214,822✔
1212
      int32_t nCols = 0;
214,803✔
1213
      int32_t ret = metaGetStbStats(pMeta->pVnode, pSuperEntry->uid, 0, &nCols);
214,803✔
1214
      if (ret < 0) {
214,812!
1215
        metaErr(TD_VID(pMeta->pVnode), ret);
×
1216
      }
1217
      pMeta->pVnode->config.vndStats.numOfNTimeSeries += (nCols - 1);
214,809✔
1218
    }
1219

1220
    if (!TSDB_CACHE_NO(pMeta->pVnode->config)) {
214,819✔
1221
      int32_t rc = tsdbCacheNewTable(pMeta->pVnode->pTsdb, pEntry->uid, pEntry->ctbEntry.suid, NULL);
775✔
1222
      if (rc < 0) {
775!
1223
        metaError("vgId:%d, %s failed at %s:%d since %s", TD_VID(pMeta->pVnode), __func__, __FILE__, __LINE__,
×
1224
                  tstrerror(rc));
1225
      }
1226
    }
1227

1228
  } else {
1229
    metaErr(TD_VID(pMeta->pVnode), code);
×
1230
  }
1231

1232
  metaFetchEntryFree(&pSuperEntry);
214,819✔
1233
  return code;
214,827✔
1234
}
1235

1236
static int32_t metaHandleNormalTableDropImpl(SMeta *pMeta, SMetaHandleParam *pParam) {
1,783✔
1237
  int32_t code = TSDB_CODE_SUCCESS;
1,783✔
1238

1239
  SMetaTableOp ops[] = {
1,783✔
1240
      {META_ENTRY_TABLE, META_TABLE_OP_DELETE},  //
1241
      {META_UID_IDX, META_TABLE_OP_DELETE},      //
1242
      {META_NAME_IDX, META_TABLE_OP_DELETE},     //
1243
      {META_BTIME_IDX, META_TABLE_OP_DELETE},    //
1244
      {META_TTL_IDX, META_TABLE_OP_DELETE},      //
1245

1246
      // {META_SCHEMA_TABLE, META_TABLE_OP_DELETE},  //
1247
  };
1248

1249
  for (int32_t i = 0; i < sizeof(ops) / sizeof(ops[0]); i++) {
10,698✔
1250
    SMetaTableOp *op = &ops[i];
8,915✔
1251
    code = metaTableOpFn[op->table][op->op](pMeta, pParam);
8,915✔
1252
    if (code) {
8,915!
1253
      const SMetaEntry *pEntry = pParam->pEntry;
×
1254
      metaErr(TD_VID(pMeta->pVnode), code);
×
1255
    }
1256
  }
1257

1258
  return code;
1,783✔
1259
}
1260

1261
static int32_t metaHandleNormalTableDrop(SMeta *pMeta, const SMetaEntry *pEntry) {
1,783✔
1262
  int32_t     code = TSDB_CODE_SUCCESS;
1,783✔
1263
  SMetaEntry *pOldEntry = NULL;
1,783✔
1264

1265
  // fetch the entry
1266
  code = metaFetchEntryByUid(pMeta, pEntry->uid, &pOldEntry);
1,783✔
1267
  if (code) {
1,783!
1268
    metaErr(TD_VID(pMeta->pVnode), code);
×
1269
    return code;
×
1270
  }
1271

1272
  SMetaHandleParam param = {
1,783✔
1273
      .pEntry = pEntry,
1274
      .pOldEntry = pOldEntry,
1275
  };
1276

1277
  // do the drop
1278
  metaWLock(pMeta);
1,783✔
1279
  code = metaHandleNormalTableDropImpl(pMeta, &param);
1,783✔
1280
  metaULock(pMeta);
1,783✔
1281
  if (code) {
1,783!
1282
    metaErr(TD_VID(pMeta->pVnode), code);
×
1283
    metaFetchEntryFree(&pOldEntry);
×
1284
    return code;
×
1285
  }
1286

1287
  // update other stuff
1288
  pMeta->pVnode->config.vndStats.numOfNTables--;
1,783✔
1289
  pMeta->pVnode->config.vndStats.numOfNTimeSeries -= (pOldEntry->ntbEntry.schemaRow.nCols - 1);
1,783✔
1290

1291
#if 0
1292
  if (tbUids) {
1293
    if (taosArrayPush(tbUids, &uid) == NULL) {
1294
      rc = terrno;
1295
      goto _exit;
1296
    }
1297
  }
1298
#endif
1299

1300
  if (!TSDB_CACHE_NO(pMeta->pVnode->config)) {
1,783!
1301
    int32_t ret = tsdbCacheDropTable(pMeta->pVnode->pTsdb, pOldEntry->uid, 0, NULL);
×
1302
    if (ret < 0) {
×
1303
      metaErr(TD_VID(pMeta->pVnode), ret);
×
1304
    }
1305
  }
1306

1307
  metaFetchEntryFree(&pOldEntry);
1,783✔
1308
  return code;
1,783✔
1309
}
1310

1311
static int32_t metaHandleChildTableDropImpl(SMeta *pMeta, const SMetaHandleParam *pParam, bool superDropped) {
4,405✔
1312
  int32_t code = TSDB_CODE_SUCCESS;
4,405✔
1313

1314
  const SMetaEntry *pEntry = pParam->pEntry;
4,405✔
1315
  const SMetaEntry *pChild = pParam->pOldEntry;
4,405✔
1316
  const SMetaEntry *pSuper = pParam->pSuperEntry;
4,405✔
1317

1318
  SMetaTableOp ops[] = {
4,405✔
1319
      {META_ENTRY_TABLE, META_TABLE_OP_DELETE},  //
1320
      {META_UID_IDX, META_TABLE_OP_DELETE},      //
1321
      {META_NAME_IDX, META_TABLE_OP_DELETE},     //
1322
      {META_CHILD_IDX, META_TABLE_OP_DELETE},    //
1323
      {META_TAG_IDX, META_TABLE_OP_DELETE},      //
1324
      {META_BTIME_IDX, META_TABLE_OP_DELETE},    //
1325
      {META_TTL_IDX, META_TABLE_OP_DELETE},      //
1326
  };
1327

1328
  for (int i = 0; i < sizeof(ops) / sizeof(ops[0]); i++) {
35,163✔
1329
    SMetaTableOp *op = &ops[i];
30,792✔
1330

1331
    if (op->table == META_ENTRY_TABLE && superDropped) {
30,792✔
1332
      continue;
3,571✔
1333
    }
1334

1335
    code = metaTableOpFn[op->table][op->op](pMeta, pParam);
27,221✔
1336
    if (code) {
27,200✔
1337
      metaErr(TD_VID(pMeta->pVnode), code);
13!
1338
      return code;
×
1339
    }
1340
  }
1341

1342
  --pMeta->pVnode->config.vndStats.numOfCTables;
4,371✔
1343
  metaUpdateStbStats(pMeta, pParam->pSuperEntry->uid, -1, 0);
4,371✔
1344
  int32_t ret = metaUidCacheClear(pMeta, pSuper->uid);
4,399✔
1345
  if (ret < 0) {
4,405!
1346
    metaErr(TD_VID(pMeta->pVnode), ret);
×
1347
  }
1348

1349
  ret = metaTbGroupCacheClear(pMeta, pSuper->uid);
4,405✔
1350
  if (ret < 0) {
4,407!
1351
    metaErr(TD_VID(pMeta->pVnode), ret);
×
1352
  }
1353
  return code;
4,406✔
1354
}
1355

1356
static int32_t metaHandleChildTableDrop(SMeta *pMeta, const SMetaEntry *pEntry, bool superDropped) {
4,403✔
1357
  int32_t     code = TSDB_CODE_SUCCESS;
4,403✔
1358
  SMetaEntry *pChild = NULL;
4,403✔
1359
  SMetaEntry *pSuper = NULL;
4,403✔
1360

1361
  // fetch old entry
1362
  code = metaFetchEntryByUid(pMeta, pEntry->uid, &pChild);
4,403✔
1363
  if (code) {
4,405!
1364
    metaErr(TD_VID(pMeta->pVnode), code);
×
1365
    return code;
×
1366
  }
1367

1368
  // fetch super entry
1369
  code = metaFetchEntryByUid(pMeta, pChild->ctbEntry.suid, &pSuper);
4,405✔
1370
  if (code) {
4,403!
1371
    metaErr(TD_VID(pMeta->pVnode), code);
×
1372
    metaFetchEntryFree(&pChild);
×
1373
    return code;
×
1374
  }
1375

1376
  SMetaHandleParam param = {
4,403✔
1377
      .pEntry = pEntry,
1378
      .pOldEntry = pChild,
1379
      .pSuperEntry = pSuper,
1380
  };
1381

1382
  // do the drop
1383
  metaWLock(pMeta);
4,403✔
1384
  code = metaHandleChildTableDropImpl(pMeta, &param, superDropped);
4,405✔
1385
  metaULock(pMeta);
4,406✔
1386
  if (code) {
4,401!
1387
    metaErr(TD_VID(pMeta->pVnode), code);
×
1388
    metaFetchEntryFree(&pChild);
×
1389
    metaFetchEntryFree(&pSuper);
×
1390
    return code;
×
1391
  }
1392

1393
  // do other stuff
1394
  if (!metaTbInFilterCache(pMeta, pSuper->name, 1)) {
4,401!
1395
    int32_t      nCols = 0;
4,401✔
1396
    SVnodeStats *pStats = &pMeta->pVnode->config.vndStats;
4,401✔
1397
    if (metaGetStbStats(pMeta->pVnode, pSuper->uid, NULL, &nCols) == 0) {
4,401!
1398
      pStats->numOfTimeSeries -= nCols - 1;
4,403✔
1399
    }
1400
  }
1401

1402
  if (!TSDB_CACHE_NO(pMeta->pVnode->config)) {
4,402✔
1403
    int32_t ret = tsdbCacheDropTable(pMeta->pVnode->pTsdb, pChild->uid, pSuper->uid, NULL);
9✔
1404
    if (ret < 0) {
9!
1405
      metaErr(TD_VID(pMeta->pVnode), ret);
×
1406
    }
1407
  }
1408

1409
#if 0
1410
  if (tbUids) {
1411
    if (taosArrayPush(tbUids, &uid) == NULL) {
1412
      rc = terrno;
1413
      goto _exit;
1414
    }
1415
  }
1416

1417
  if ((type == TSDB_CHILD_TABLE) && tbUid) {
1418
    *tbUid = uid;
1419
  }
1420
#endif
1421
  metaFetchEntryFree(&pChild);
4,402✔
1422
  metaFetchEntryFree(&pSuper);
4,405✔
1423
  return code;
4,407✔
1424
}
1425

1426
static int32_t metaGetChildUidsOfSuperTable(SMeta *pMeta, tb_uid_t suid, SArray **childList) {
5,513✔
1427
  int32_t code = TSDB_CODE_SUCCESS;
5,513✔
1428
  void   *key = NULL;
5,513✔
1429
  int32_t keySize = 0;
5,513✔
1430
  int32_t c;
1431

1432
  *childList = taosArrayInit(64, sizeof(tb_uid_t));
5,513✔
1433
  if (*childList == NULL) {
5,545!
1434
    return terrno;
×
1435
  }
1436

1437
  TBC *cursor = NULL;
5,545✔
1438
  code = tdbTbcOpen(pMeta->pCtbIdx, &cursor, NULL);
5,545✔
1439
  if (code) {
5,550!
1440
    taosArrayDestroy(*childList);
×
1441
    *childList = NULL;
×
1442
    return code;
×
1443
  }
1444

1445
  int32_t rc = tdbTbcMoveTo(cursor,
5,550✔
1446
                            &(SCtbIdxKey){
5,550✔
1447
                                .suid = suid,
1448
                                .uid = INT64_MIN,
1449
                            },
1450
                            sizeof(SCtbIdxKey), &c);
1451
  if (rc < 0) {
5,548!
1452
    tdbTbcClose(cursor);
×
1453
    return 0;
×
1454
  }
1455

1456
  for (;;) {
1457
    if (tdbTbcNext(cursor, &key, &keySize, NULL, NULL) < 0) {
16,718✔
1458
      break;
3,337✔
1459
    }
1460

1461
    if (((SCtbIdxKey *)key)->suid < suid) {
13,389✔
1462
      continue;
2,377✔
1463
    } else if (((SCtbIdxKey *)key)->suid > suid) {
11,012✔
1464
      break;
2,216✔
1465
    }
1466

1467
    if (taosArrayPush(*childList, &(((SCtbIdxKey *)key)->uid)) == NULL) {
17,589!
1468
      tdbFreeClear(key);
×
1469
      tdbTbcClose(cursor);
×
1470
      taosArrayDestroy(*childList);
×
1471
      *childList = NULL;
×
1472
      return terrno;
×
1473
    }
1474
  }
1475

1476
  tdbTbcClose(cursor);
5,553✔
1477
  tdbFreeClear(key);
5,552✔
1478
  return code;
5,553✔
1479
}
1480

1481
static int32_t metaHandleSuperTableDropImpl(SMeta *pMeta, const SMetaHandleParam *pParam) {
2,299✔
1482
  int32_t           code = TSDB_CODE_SUCCESS;
2,299✔
1483
  const SMetaEntry *pEntry = pParam->pEntry;
2,299✔
1484

1485
  SMetaTableOp ops[] = {
2,299✔
1486
      {META_ENTRY_TABLE, META_TABLE_OP_DELETE},  //
1487
      {META_UID_IDX, META_TABLE_OP_DELETE},      //
1488
      {META_NAME_IDX, META_TABLE_OP_DELETE},     //
1489
      {META_SUID_IDX, META_TABLE_OP_DELETE},     //
1490

1491
      // {META_SCHEMA_TABLE, META_TABLE_OP_UPDATA},  // TODO: here should be insert
1492
  };
1493

1494
  for (int i = 0; i < sizeof(ops) / sizeof(ops[0]); i++) {
11,497✔
1495
    SMetaTableOp *op = &ops[i];
9,197✔
1496

1497
    code = metaTableOpFn[op->table][op->op](pMeta, pParam);
9,197✔
1498
    if (TSDB_CODE_SUCCESS != code) {
9,199✔
1499
      metaErr(TD_VID(pMeta->pVnode), code);
1!
1500
      return code;
×
1501
    }
1502
  }
1503

1504
  int32_t ret = metaStatsCacheDrop(pMeta, pEntry->uid);
2,300✔
1505
  if (ret < 0) {
2,300✔
1506
    metaErr(TD_VID(pMeta->pVnode), ret);
286!
1507
  }
1508
  return code;
2,298✔
1509
}
1510

1511
static int32_t metaHandleNormalTableUpdateImpl(SMeta *pMeta, const SMetaHandleParam *pParam) {
225✔
1512
  int32_t code = TSDB_CODE_SUCCESS;
225✔
1513

1514
  const SMetaEntry *pEntry = pParam->pEntry;
225✔
1515

1516
  SMetaTableOp ops[] = {
225✔
1517
      {META_ENTRY_TABLE, META_TABLE_OP_UPDATA},   //
1518
      {META_SCHEMA_TABLE, META_TABLE_OP_UPDATA},  //
1519
      {META_UID_IDX, META_TABLE_OP_UPDATA},       //
1520
      {META_TTL_IDX, META_TABLE_OP_UPDATA},       //
1521
  };
1522
  for (int32_t i = 0; i < sizeof(ops) / sizeof(ops[0]); i++) {
1,125✔
1523
    SMetaTableOp *op = &ops[i];
900✔
1524
    code = metaTableOpFn[op->table][op->op](pMeta, pParam);
900✔
1525
    if (code) {
900!
1526
      metaErr(TD_VID(pMeta->pVnode), code);
×
1527
      return code;
×
1528
    }
1529
  }
1530
#if 0
1531
  if (metaUpdateChangeTime(pMeta, entry.uid, pAlterTbReq->ctimeMs) < 0) {
1532
    metaError("vgId:%d, failed to update change time:%s uid:%" PRId64, TD_VID(pMeta->pVnode), entry.name, entry.uid);
1533
  }
1534
#endif
1535
  return code;
225✔
1536
}
1537

1538
static int32_t metaHandleChildTableUpdateImpl(SMeta *pMeta, const SMetaHandleParam *pParam) {
691✔
1539
  int32_t code = TSDB_CODE_SUCCESS;
691✔
1540

1541
  const SMetaEntry *pEntry = pParam->pEntry;
691✔
1542
  const SMetaEntry *pOldEntry = pParam->pOldEntry;
691✔
1543
  const SMetaEntry *pSuperEntry = pParam->pSuperEntry;
691✔
1544

1545
  SMetaTableOp ops[] = {
691✔
1546
      {META_ENTRY_TABLE, META_TABLE_OP_UPDATA},  //
1547
      {META_UID_IDX, META_TABLE_OP_UPDATA},      //
1548
      {META_TAG_IDX, META_TABLE_OP_UPDATA},      //
1549
      {META_CHILD_IDX, META_TABLE_OP_UPDATA},    //
1550
      {META_TTL_IDX, META_TABLE_OP_UPDATA},      //
1551
  };
1552

1553
  for (int i = 0; i < sizeof(ops) / sizeof(ops[0]); i++) {
4,146✔
1554
    SMetaTableOp *op = &ops[i];
3,455✔
1555
    code = metaTableOpFn[op->table][op->op](pMeta, pParam);
3,455✔
1556
    if (code) {
3,455!
1557
      metaErr(TD_VID(pMeta->pVnode), code);
×
1558
      return code;
×
1559
    }
1560
  }
1561

1562
  if (metaUidCacheClear(pMeta, pSuperEntry->uid) < 0) {
691!
1563
    metaErr(TD_VID(pMeta->pVnode), code);
×
1564
  }
1565

1566
  if (metaTbGroupCacheClear(pMeta, pSuperEntry->uid) < 0) {
691!
1567
    metaErr(TD_VID(pMeta->pVnode), code);
×
1568
  }
1569
  return code;
691✔
1570
#if 0
1571
  if (metaUpdateChangeTime(pMeta, ctbEntry.uid, pReq->ctimeMs) < 0) {
1572
    metaError("meta/table: failed to update change time:%s uid:%" PRId64, ctbEntry.name, ctbEntry.uid);
1573
  }
1574
#endif
1575
}
1576

1577
static int32_t metaHandleSuperTableUpdateImpl(SMeta *pMeta, SMetaHandleParam *pParam) {
9,521✔
1578
  int32_t code = TSDB_CODE_SUCCESS;
9,521✔
1579

1580
  const SMetaEntry *pEntry = pParam->pEntry;
9,521✔
1581
  const SMetaEntry *pOldEntry = pParam->pOldEntry;
9,521✔
1582

1583
  SMetaTableOp ops[] = {
9,521✔
1584
      {META_ENTRY_TABLE, META_TABLE_OP_UPDATA},   //
1585
      {META_UID_IDX, META_TABLE_OP_UPDATA},       //
1586
      {META_SCHEMA_TABLE, META_TABLE_OP_UPDATA},  //
1587
  };
1588

1589
  for (int i = 0; i < sizeof(ops) / sizeof(ops[0]); i++) {
38,088✔
1590
    SMetaTableOp *op = &ops[i];
28,569✔
1591
    code = metaTableOpFn[op->table][op->op](pMeta, pParam);
28,569✔
1592
    if (code) {
28,567!
1593
      metaErr(TD_VID(pMeta->pVnode), code);
×
1594
      return code;
×
1595
    }
1596
  }
1597

1598
  return code;
9,519✔
1599
}
1600

1601
static int32_t metaHandleSuperTableUpdate(SMeta *pMeta, const SMetaEntry *pEntry) {
9,510✔
1602
  int32_t code = TSDB_CODE_SUCCESS;
9,510✔
1603

1604
  SMetaEntry *pOldEntry = NULL;
9,510✔
1605

1606
  code = metaFetchEntryByUid(pMeta, pEntry->uid, &pOldEntry);
9,510✔
1607
  if (code) {
9,531!
1608
    metaErr(TD_VID(pMeta->pVnode), code);
×
1609
    return code;
×
1610
  }
1611

1612
  SMetaHandleParam param = {
9,531✔
1613
      .pEntry = pEntry,
1614
      .pOldEntry = pOldEntry,
1615
  };
1616
  metaWLock(pMeta);
9,531✔
1617
  code = metaHandleSuperTableUpdateImpl(pMeta, &param);
9,527✔
1618
  metaULock(pMeta);
9,519✔
1619
  if (code) {
9,526!
1620
    metaErr(TD_VID(pMeta->pVnode), code);
×
1621
    metaFetchEntryFree(&pOldEntry);
×
1622
    return code;
×
1623
  }
1624

1625
  int     nCols = pEntry->stbEntry.schemaRow.nCols;
9,526✔
1626
  int     onCols = pOldEntry->stbEntry.schemaRow.nCols;
9,526✔
1627
  int32_t deltaCol = nCols - onCols;
9,526✔
1628
  bool    updStat = deltaCol != 0 && !metaTbInFilterCache(pMeta, pEntry->name, 1);
9,526!
1629

1630
  if (!TSDB_CACHE_NO(pMeta->pVnode->config)) {
9,526✔
1631
    STsdb  *pTsdb = pMeta->pVnode->pTsdb;
2,136✔
1632
    SArray *uids = NULL; /*taosArrayInit(8, sizeof(int64_t));
2,136✔
1633
     if (uids == NULL) {
1634
       metaErr(TD_VID(pMeta->pVnode), code);
1635
       metaFetchEntryFree(&pOldEntry);
1636
       return terrno;
1637
       }*/
1638
    if (deltaCol == 1) {
2,136✔
1639
      int16_t cid = pEntry->stbEntry.schemaRow.pSchema[nCols - 1].colId;
64✔
1640
      int8_t  col_type = pEntry->stbEntry.schemaRow.pSchema[nCols - 1].type;
64✔
1641

1642
      code = metaGetChildUidsOfSuperTable(pMeta, pEntry->uid, &uids);
64✔
1643
      if (code) {
64!
1644
        metaErr(TD_VID(pMeta->pVnode), code);
×
1645
        metaFetchEntryFree(&pOldEntry);
×
1646
        return code;
×
1647
      }
1648
      // TAOS_CHECK_RETURN(metaGetSubtables(pMeta, pEntry->uid, uids));
1649
      TAOS_CHECK_RETURN(tsdbCacheNewSTableColumn(pTsdb, uids, cid, col_type));
64!
1650
    } else if (deltaCol == -1) {
2,072✔
1651
      int16_t cid = -1;
64✔
1652
      bool    hasPrimaryKey = false;
64✔
1653
      if (onCols >= 2) {
64!
1654
        hasPrimaryKey = (pOldEntry->stbEntry.schemaRow.pSchema[1].flags & COL_IS_KEY) ? true : false;
64✔
1655
      }
1656
      for (int i = 0, j = 0; i < nCols && j < onCols; ++i, ++j) {
416!
1657
        if (pEntry->stbEntry.schemaRow.pSchema[i].colId != pOldEntry->stbEntry.schemaRow.pSchema[j].colId) {
384✔
1658
          cid = pOldEntry->stbEntry.schemaRow.pSchema[j].colId;
32✔
1659
          break;
32✔
1660
        }
1661
      }
1662

1663
      if (cid != -1) {
64✔
1664
        code = metaGetChildUidsOfSuperTable(pMeta, pEntry->uid, &uids);
32✔
1665
        if (code) {
32!
1666
          metaErr(TD_VID(pMeta->pVnode), code);
×
1667
          metaFetchEntryFree(&pOldEntry);
×
1668
          return code;
×
1669
        }
1670
        // TAOS_CHECK_RETURN(metaGetSubtables(pMeta, pEntry->uid, uids));
1671
        TAOS_CHECK_RETURN(tsdbCacheDropSTableColumn(pTsdb, uids, cid, hasPrimaryKey));
32!
1672
      }
1673
    }
1674
    if (uids) taosArrayDestroy(uids);
2,135✔
1675

1676
    tsdbCacheInvalidateSchema(pTsdb, pEntry->uid, -1, pEntry->stbEntry.schemaRow.version);
2,135✔
1677
  }
1678

1679
  metaFetchEntryFree(&pOldEntry);
9,525✔
1680
  return code;
9,525✔
1681
}
1682

1683
static int32_t metaHandleChildTableUpdate(SMeta *pMeta, const SMetaEntry *pEntry) {
691✔
1684
  int32_t code = TSDB_CODE_SUCCESS;
691✔
1685

1686
  SMetaEntry *pOldEntry = NULL;
691✔
1687
  SMetaEntry *pSuperEntry = NULL;
691✔
1688

1689
  code = metaFetchEntryByUid(pMeta, pEntry->uid, &pOldEntry);
691✔
1690
  if (code) {
691!
1691
    metaErr(TD_VID(pMeta->pVnode), code);
×
1692
    return code;
×
1693
  }
1694

1695
  code = metaFetchEntryByUid(pMeta, pEntry->ctbEntry.suid, &pSuperEntry);
691✔
1696
  if (code) {
691!
1697
    metaErr(TD_VID(pMeta->pVnode), code);
×
1698
    metaFetchEntryFree(&pOldEntry);
×
1699
    return code;
×
1700
  }
1701

1702
  SMetaHandleParam param = {
691✔
1703
      .pEntry = pEntry,
1704
      .pOldEntry = pOldEntry,
1705
      .pSuperEntry = pSuperEntry,
1706
  };
1707

1708
  metaWLock(pMeta);
691✔
1709
  code = metaHandleChildTableUpdateImpl(pMeta, &param);
691✔
1710
  metaULock(pMeta);
691✔
1711
  if (code) {
691!
1712
    metaErr(TD_VID(pMeta->pVnode), code);
×
1713
    metaFetchEntryFree(&pOldEntry);
×
1714
    metaFetchEntryFree(&pSuperEntry);
×
1715
    return code;
×
1716
  }
1717

1718
  metaFetchEntryFree(&pOldEntry);
691✔
1719
  metaFetchEntryFree(&pSuperEntry);
691✔
1720
  return code;
691✔
1721
}
1722

1723
static int32_t metaHandleNormalTableUpdate(SMeta *pMeta, const SMetaEntry *pEntry) {
225✔
1724
  int32_t     code = TSDB_CODE_SUCCESS;
225✔
1725
  SMetaEntry *pOldEntry = NULL;
225✔
1726

1727
  // fetch old entry
1728
  code = metaFetchEntryByUid(pMeta, pEntry->uid, &pOldEntry);
225✔
1729
  if (code) {
225!
1730
    metaErr(TD_VID(pMeta->pVnode), code);
×
1731
    return code;
×
1732
  }
1733

1734
  // handle update
1735
  SMetaHandleParam param = {
225✔
1736
      .pEntry = pEntry,
1737
      .pOldEntry = pOldEntry,
1738
  };
1739
  metaWLock(pMeta);
225✔
1740
  code = metaHandleNormalTableUpdateImpl(pMeta, &param);
225✔
1741
  metaULock(pMeta);
225✔
1742
  if (code) {
225!
1743
    metaErr(TD_VID(pMeta->pVnode), code);
×
1744
    metaFetchEntryFree(&pOldEntry);
×
1745
    return code;
×
1746
  }
1747

1748
  // do other stuff
1749
  if (!TSDB_CACHE_NO(pMeta->pVnode->config) &&
225✔
1750
      pEntry->ntbEntry.schemaRow.version != pOldEntry->ntbEntry.schemaRow.version) {
6!
1751
#if 0
1752
    {  // for add column
1753
      int16_t cid = pSchema->pSchema[entry.ntbEntry.schemaRow.nCols - 1].colId;
1754
      int8_t  col_type = pSchema->pSchema[entry.ntbEntry.schemaRow.nCols - 1].type;
1755
      int32_t ret = tsdbCacheNewNTableColumn(pMeta->pVnode->pTsdb, entry.uid, cid, col_type);
1756
      if (ret < 0) {
1757
        terrno = ret;
1758
        goto _err;
1759
      }
1760
    }
1761
    {  // for drop column
1762

1763
      if (!TSDB_CACHE_NO(pMeta->pVnode->config)) {
1764
        int16_t cid = pColumn->colId;
1765

1766
        if (tsdbCacheDropNTableColumn(pMeta->pVnode->pTsdb, entry.uid, cid, hasPrimayKey) != 0) {
1767
          metaError("vgId:%d, failed to drop ntable column:%s uid:%" PRId64, TD_VID(pMeta->pVnode), entry.name,
1768
                    entry.uid);
1769
        }
1770
        tsdbCacheInvalidateSchema(pMeta->pVnode->pTsdb, 0, entry.uid, pSchema->version);
1771
      }
1772
    }
1773
    }
1774
#endif
1775
    tsdbCacheInvalidateSchema(pMeta->pVnode->pTsdb, 0, pEntry->uid, pEntry->ntbEntry.schemaRow.version);
6✔
1776
  }
1777
  metaTimeSeriesNotifyCheck(pMeta);
225✔
1778
  metaFetchEntryFree(&pOldEntry);
225✔
1779
  return code;
225✔
1780
}
1781

1782
static int32_t metaHandleSuperTableDrop(SMeta *pMeta, const SMetaEntry *pEntry) {
2,263✔
1783
  int32_t     code = TSDB_CODE_SUCCESS;
2,263✔
1784
  SArray     *childList = NULL;
2,263✔
1785
  SMetaEntry *pOldEntry = NULL;
2,263✔
1786

1787
  code = metaFetchEntryByUid(pMeta, pEntry->uid, &pOldEntry);
2,263✔
1788
  if (code) {
2,285!
1789
    metaErr(TD_VID(pMeta->pVnode), code);
×
1790
    return code;
×
1791
  }
1792

1793
  code = metaGetChildUidsOfSuperTable(pMeta, pEntry->uid, &childList);
2,285✔
1794
  if (code) {
2,298!
1795
    metaErr(TD_VID(pMeta->pVnode), code);
×
1796
    metaFetchEntryFree(&pOldEntry);
×
1797
    return code;
×
1798
  }
1799

1800
  if (tsdbCacheDropSubTables(pMeta->pVnode->pTsdb, childList, pEntry->uid) < 0) {
2,298!
1801
    metaError("vgId:%d, failed to drop stb:%s uid:%" PRId64 " since %s", TD_VID(pMeta->pVnode), pEntry->name,
×
1802
              pEntry->uid, tstrerror(terrno));
1803
  }
1804

1805
  // loop to drop all child tables
1806
  for (int32_t i = 0; i < taosArrayGetSize(childList); i++) {
5,872✔
1807
    SMetaEntry childEntry = {
7,145✔
1808
        .version = pEntry->version,
3,572✔
1809
        .uid = *(tb_uid_t *)taosArrayGet(childList, i),
3,572✔
1810
        .type = -TSDB_CHILD_TABLE,
1811
    };
1812

1813
    code = metaHandleChildTableDrop(pMeta, &childEntry, true);
3,573✔
1814
    if (code) {
3,572!
1815
      metaErr(TD_VID(pMeta->pVnode), code);
×
1816
    }
1817
  }
1818

1819
  // do drop super table
1820
  SMetaHandleParam param = {
2,299✔
1821
      .pEntry = pEntry,
1822
      .pOldEntry = pOldEntry,
1823
  };
1824
  metaWLock(pMeta);
2,299✔
1825
  code = metaHandleSuperTableDropImpl(pMeta, &param);
2,299✔
1826
  metaULock(pMeta);
2,298✔
1827
  if (code) {
2,298!
1828
    metaErr(TD_VID(pMeta->pVnode), code);
×
1829
    taosArrayDestroy(childList);
×
1830
    metaFetchEntryFree(&pOldEntry);
×
1831
    return code;
×
1832
  }
1833

1834
  // do other stuff
1835
  metaUpdTimeSeriesNum(pMeta);
2,298✔
1836

1837
  // free resource and return
1838
  taosArrayDestroy(childList);
2,300✔
1839
  metaFetchEntryFree(&pOldEntry);
2,300✔
1840
  return code;
2,300✔
1841
}
1842

1843
int32_t metaHandleEntry2(SMeta *pMeta, const SMetaEntry *pEntry) {
271,620✔
1844
  int32_t   code = TSDB_CODE_SUCCESS;
271,620✔
1845
  int32_t   vgId = TD_VID(pMeta->pVnode);
271,620✔
1846
  SMetaInfo info = {0};
271,620✔
1847
  int8_t    type = pEntry->type > 0 ? pEntry->type : -pEntry->type;
271,620✔
1848

1849
  if (NULL == pMeta || NULL == pEntry) {
271,620!
1850
    metaError("%s failed at %s:%d since invalid parameter", __func__, __FILE__, __LINE__);
×
1851
    return TSDB_CODE_INVALID_PARA;
×
1852
  }
1853

1854
  if (pEntry->type > 0) {
272,032✔
1855
    bool isExist = false;
267,123✔
1856
    if (TSDB_CODE_SUCCESS == metaGetInfo(pMeta, pEntry->uid, &info, NULL)) {
267,123✔
1857
      isExist = true;
10,440✔
1858
    }
1859

1860
    switch (type) {
267,142!
1861
      case TSDB_SUPER_TABLE: {
37,185✔
1862
        if (isExist) {
37,185✔
1863
          code = metaHandleSuperTableUpdate(pMeta, pEntry);
9,526✔
1864
        } else {
1865
          code = metaHandleSuperTableCreate(pMeta, pEntry);
27,659✔
1866
        }
1867
        break;
37,205✔
1868
      }
1869
      case TSDB_CHILD_TABLE: {
215,516✔
1870
        if (isExist) {
215,516✔
1871
          code = metaHandleChildTableUpdate(pMeta, pEntry);
691✔
1872
        } else {
1873
          code = metaHandleChildTableCreate(pMeta, pEntry);
214,825✔
1874
        }
1875
        break;
215,505✔
1876
      }
1877
      case TSDB_NORMAL_TABLE: {
14,450✔
1878
        if (isExist) {
14,450✔
1879
          code = metaHandleNormalTableUpdate(pMeta, pEntry);
225✔
1880
        } else {
1881
          code = metaHandleNormalTableCreate(pMeta, pEntry);
14,225✔
1882
        }
1883
        break;
14,450✔
1884
      }
1885
      default: {
×
1886
        code = TSDB_CODE_INVALID_PARA;
×
1887
        break;
×
1888
      }
1889
    }
1890
  } else {
1891
    switch (type) {
4,909✔
1892
      case TSDB_SUPER_TABLE: {
2,265✔
1893
        code = metaHandleSuperTableDrop(pMeta, pEntry);
2,265✔
1894
        break;
2,299✔
1895
      }
1896
      case TSDB_CHILD_TABLE: {
831✔
1897
        code = metaHandleChildTableDrop(pMeta, pEntry, false);
831✔
1898
        break;
831✔
1899
      }
1900
      case TSDB_NORMAL_TABLE: {
1,783✔
1901
        code = metaHandleNormalTableDrop(pMeta, pEntry);
1,783✔
1902
        break;
1,783✔
1903
      }
1904
      default: {
30✔
1905
        code = TSDB_CODE_INVALID_PARA;
30✔
1906
        break;
30✔
1907
      }
1908
    }
1909
  }
1910

1911
  if (TSDB_CODE_SUCCESS == code) {
272,094✔
1912
    pMeta->changed = true;
272,066✔
1913
    metaDebug("vgId:%d, %s success, version:%" PRId64 " type:%d uid:%" PRId64 " name:%s", vgId, __func__,
272,066✔
1914
              pEntry->version, pEntry->type, pEntry->uid, pEntry->type > 0 ? pEntry->name : "");
1915
  } else {
1916
    metaErr(vgId, code);
28!
1917
  }
1918
  TAOS_RETURN(code);
272,095✔
1919
}
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