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

H
Hongze Cheng 已提交
16
#include "meta.h"
H
refact  
Hongze Cheng 已提交
17

H
Hongze Cheng 已提交
18 19 20 21 22 23 24
static int metaHandleEntry(SMeta *pMeta, const SMetaEntry *pME);
static int metaSaveToTbDb(SMeta *pMeta, const SMetaEntry *pME);
static int metaUpdateUidIdx(SMeta *pMeta, const SMetaEntry *pME);
static int metaUpdateNameIdx(SMeta *pMeta, const SMetaEntry *pME);
static int metaUpdateTtlIdx(SMeta *pMeta, const SMetaEntry *pME);
static int metaSaveToSkmDb(SMeta *pMeta, const SMetaEntry *pME);
static int metaUpdateCtbIdx(SMeta *pMeta, const SMetaEntry *pME);
H
Hongze Cheng 已提交
25
static int metaUpdateTagIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry);
H
Hongze Cheng 已提交
26
static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type);
H
Hongze Cheng 已提交
27 28

int metaCreateSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) {
H
Hongze Cheng 已提交
29
  SMetaEntry  me = {0};
H
Hongze Cheng 已提交
30 31 32 33
  int         kLen = 0;
  int         vLen = 0;
  const void *pKey = NULL;
  const void *pVal = NULL;
H
Hongze Cheng 已提交
34
  void       *pBuf = NULL;
H
Hongze Cheng 已提交
35
  int32_t     szBuf = 0;
H
Hongze Cheng 已提交
36
  void       *p = NULL;
H
Hongze Cheng 已提交
37 38 39
  SMetaReader mr = {0};

  // validate req
H
Hongze Cheng 已提交
40
  metaReaderInit(&mr, pMeta, 0);
H
Hongze Cheng 已提交
41
  if (metaGetTableEntryByName(&mr, pReq->name) == 0) {
H
Hongze Cheng 已提交
42 43
// TODO: just for pass case
#if 0
H
Hongze Cheng 已提交
44 45 46
    terrno = TSDB_CODE_TDB_TABLE_ALREADY_EXIST;
    metaReaderClear(&mr);
    return -1;
H
Hongze Cheng 已提交
47 48 49 50
#else
    metaReaderClear(&mr);
    return 0;
#endif
H
Hongze Cheng 已提交
51
  }
H
Hongze Cheng 已提交
52
  metaReaderClear(&mr);
H
Hongze Cheng 已提交
53 54

  // set structs
H
Hongze Cheng 已提交
55
  me.version = version;
H
Hongze Cheng 已提交
56 57 58
  me.type = TSDB_SUPER_TABLE;
  me.uid = pReq->suid;
  me.name = pReq->name;
59
  me.stbEntry.schemaRow = pReq->schemaRow;
H
Hongze Cheng 已提交
60
  me.stbEntry.schemaTag = pReq->schemaTag;
H
Hongze Cheng 已提交
61

H
Hongze Cheng 已提交
62
  if (metaHandleEntry(pMeta, &me) < 0) goto _err;
H
Hongze Cheng 已提交
63

H
Hongze Cheng 已提交
64
  metaDebug("vgId:%d super table is created, name:%s uid: %" PRId64, TD_VID(pMeta->pVnode), pReq->name, pReq->suid);
H
Hongze Cheng 已提交
65 66 67 68

  return 0;

_err:
H
Hongze Cheng 已提交
69
  metaError("vgId:%d failed to create super table: %s uid: %" PRId64 " since %s", TD_VID(pMeta->pVnode), pReq->name,
H
Hongze Cheng 已提交
70 71 72 73 74
            pReq->suid, tstrerror(terrno));
  return -1;
}

int metaDropSTable(SMeta *pMeta, int64_t verison, SVDropStbReq *pReq) {
H
Hongze Cheng 已提交
75 76 77 78 79 80 81 82 83 84 85 86
  void *pKey = NULL;
  int   nKey = 0;
  void *pData = NULL;
  int   nData = 0;
  int   c = 0;
  int   rc = 0;

  // check if super table exists
  rc = tdbTbGet(pMeta->pNameIdx, pReq->name, strlen(pReq->name) + 1, &pData, &nData);
  if (rc < 0 || *(tb_uid_t *)pData != pReq->suid) {
    terrno = TSDB_CODE_VND_TABLE_NOT_EXIST;
    return -1;
H
Hongze Cheng 已提交
87 88
  }

H
Hongze Cheng 已提交
89 90 91
  // drop all child tables
  TBC    *pCtbIdxc = NULL;
  SArray *pArray = taosArrayInit(8, sizeof(tb_uid_t));
H
Hongze Cheng 已提交
92

H
Hongze Cheng 已提交
93
  tdbTbcOpen(pMeta->pCtbIdx, &pCtbIdxc, &pMeta->txn);
H
Hongze Cheng 已提交
94 95
  rc = tdbTbcMoveTo(pCtbIdxc, &(SCtbIdxKey){.suid = pReq->suid, .uid = INT64_MIN}, sizeof(SCtbIdxKey), &c);
  if (rc < 0) {
H
Hongze Cheng 已提交
96
    tdbTbcClose(pCtbIdxc);
H
Hongze Cheng 已提交
97 98
    metaWLock(pMeta);
    goto _drop_super_table;
H
Hongze Cheng 已提交
99 100 101
  }

  for (;;) {
H
Hongze Cheng 已提交
102 103
    rc = tdbTbcNext(pCtbIdxc, &pKey, &nKey, NULL, NULL);
    if (rc < 0) break;
H
Hongze Cheng 已提交
104

H
Hongze Cheng 已提交
105 106 107 108 109
    if (((SCtbIdxKey *)pKey)->suid < pReq->suid) {
      continue;
    } else if (((SCtbIdxKey *)pKey)->suid > pReq->suid) {
      break;
    }
H
Hongze Cheng 已提交
110

H
Hongze Cheng 已提交
111 112 113 114 115 116
    taosArrayPush(pArray, &(((SCtbIdxKey *)pKey)->uid));
  }

  tdbTbcClose(pCtbIdxc);

  metaWLock(pMeta);
H
Hongze Cheng 已提交
117

H
Hongze Cheng 已提交
118 119
  for (int32_t iChild = 0; iChild < taosArrayGetSize(pArray); iChild++) {
    tb_uid_t uid = *(tb_uid_t *)taosArrayGet(pArray, iChild);
H
Hongze Cheng 已提交
120
    metaDropTableByUid(pMeta, uid, NULL);
H
Hongze Cheng 已提交
121 122
  }

H
Hongze Cheng 已提交
123 124 125 126 127 128 129 130 131 132 133 134
  taosArrayDestroy(pArray);

  // drop super table
_drop_super_table:
  tdbTbGet(pMeta->pUidIdx, &pReq->suid, sizeof(tb_uid_t), &pData, &nData);
  tdbTbDelete(pMeta->pTbDb, &(STbDbKey){.version = *(int64_t *)pData, .uid = pReq->suid}, sizeof(STbDbKey),
              &pMeta->txn);
  tdbTbDelete(pMeta->pNameIdx, pReq->name, strlen(pReq->name) + 1, &pMeta->txn);
  tdbTbDelete(pMeta->pUidIdx, &pReq->suid, sizeof(tb_uid_t), &pMeta->txn);

  metaULock(pMeta);

H
Hongze Cheng 已提交
135
_exit:
H
Hongze Cheng 已提交
136 137
  tdbFree(pKey);
  tdbFree(pData);
H
Hongze Cheng 已提交
138
  metaDebug("vgId:%d  super table %s uid:%" PRId64 " is dropped", TD_VID(pMeta->pVnode), pReq->name, pReq->suid);
H
Hongze Cheng 已提交
139 140 141
  return 0;
}

H
Hongze Cheng 已提交
142 143 144
int metaAlterSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) {
  SMetaEntry  oStbEntry = {0};
  SMetaEntry  nStbEntry = {0};
H
Hongze Cheng 已提交
145 146
  TBC        *pUidIdxc = NULL;
  TBC        *pTbDbc = NULL;
H
Hongze Cheng 已提交
147 148 149 150 151 152 153
  const void *pData;
  int         nData;
  int64_t     oversion;
  SDecoder    dc = {0};
  int32_t     ret;
  int32_t     c;

H
Hongze Cheng 已提交
154 155
  tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, &pMeta->txn);
  ret = tdbTbcMoveTo(pUidIdxc, &pReq->suid, sizeof(tb_uid_t), &c);
H
Hongze Cheng 已提交
156 157 158 159 160
  if (ret < 0 || c) {
    ASSERT(0);
    return -1;
  }

H
Hongze Cheng 已提交
161
  ret = tdbTbcGet(pUidIdxc, NULL, NULL, &pData, &nData);
H
Hongze Cheng 已提交
162 163 164 165 166 167 168
  if (ret < 0) {
    ASSERT(0);
    return -1;
  }

  oversion = *(int64_t *)pData;

H
Hongze Cheng 已提交
169 170
  tdbTbcOpen(pMeta->pTbDb, &pTbDbc, &pMeta->txn);
  ret = tdbTbcMoveTo(pTbDbc, &((STbDbKey){.uid = pReq->suid, .version = oversion}), sizeof(STbDbKey), &c);
H
Hongze Cheng 已提交
171 172
  ASSERT(ret == 0 && c == 0);

H
Hongze Cheng 已提交
173
  ret = tdbTbcGet(pTbDbc, NULL, NULL, &pData, &nData);
H
Hongze Cheng 已提交
174 175
  ASSERT(ret == 0);

H
Hongze Cheng 已提交
176 177 178
  oStbEntry.pBuf = taosMemoryMalloc(nData);
  memcpy(oStbEntry.pBuf, pData, nData);
  tDecoderInit(&dc, oStbEntry.pBuf, nData);
H
Hongze Cheng 已提交
179 180 181 182 183 184
  metaDecodeEntry(&dc, &oStbEntry);

  nStbEntry.version = version;
  nStbEntry.type = TSDB_SUPER_TABLE;
  nStbEntry.uid = pReq->suid;
  nStbEntry.name = pReq->name;
185
  nStbEntry.stbEntry.schemaRow = pReq->schemaRow;
H
Hongze Cheng 已提交
186 187 188 189
  nStbEntry.stbEntry.schemaTag = pReq->schemaTag;

  metaWLock(pMeta);
  // compare two entry
190 191
  if (oStbEntry.stbEntry.schemaRow.version != pReq->schemaRow.version) {
    metaSaveToSkmDb(pMeta, &nStbEntry);
H
Hongze Cheng 已提交
192 193 194 195 196 197 198 199 200 201
  }

  // if (oStbEntry.stbEntry.schemaTag.sver != pReq->schemaTag.sver) {
  //   // change tag schema
  // }

  // update table.db
  metaSaveToTbDb(pMeta, &nStbEntry);

  // update uid index
H
Hongze Cheng 已提交
202
  tdbTbcUpsert(pUidIdxc, &pReq->suid, sizeof(tb_uid_t), &version, sizeof(version), 0);
H
Hongze Cheng 已提交
203

H
Hongze Cheng 已提交
204
  if (oStbEntry.pBuf) taosMemoryFree(oStbEntry.pBuf);
H
Hongze Cheng 已提交
205 206
  metaULock(pMeta);
  tDecoderClear(&dc);
H
Hongze Cheng 已提交
207 208
  tdbTbcClose(pTbDbc);
  tdbTbcClose(pUidIdxc);
H
Hongze Cheng 已提交
209 210 211
  return 0;
}

H
Hongze Cheng 已提交
212
int metaCreateTable(SMeta *pMeta, int64_t version, SVCreateTbReq *pReq) {
H
Hongze Cheng 已提交
213 214
  SMetaEntry  me = {0};
  SMetaReader mr = {0};
H
Hongze Cheng 已提交
215 216 217 218 219

  // validate message
  if (pReq->type != TSDB_CHILD_TABLE && pReq->type != TSDB_NORMAL_TABLE) {
    terrno = TSDB_CODE_INVALID_MSG;
    goto _err;
H
more  
Hongze Cheng 已提交
220 221
  }

H
Hongze Cheng 已提交
222
  // validate req
H
Hongze Cheng 已提交
223
  metaReaderInit(&mr, pMeta, 0);
H
Hongze Cheng 已提交
224
  if (metaGetTableEntryByName(&mr, pReq->name) == 0) {
H
Hongze Cheng 已提交
225 226 227 228
    pReq->uid = mr.me.uid;
    if (pReq->type == TSDB_CHILD_TABLE) {
      pReq->ctb.suid = mr.me.ctbEntry.suid;
    }
H
Hongze Cheng 已提交
229 230 231
    terrno = TSDB_CODE_TDB_TABLE_ALREADY_EXIST;
    metaReaderClear(&mr);
    return -1;
H
Hongze Cheng 已提交
232
  }
H
Hongze Cheng 已提交
233
  metaReaderClear(&mr);
H
Hongze Cheng 已提交
234 235

  // build SMetaEntry
H
Hongze Cheng 已提交
236
  me.version = version;
H
Hongze Cheng 已提交
237 238 239 240 241 242 243 244 245 246 247
  me.type = pReq->type;
  me.uid = pReq->uid;
  me.name = pReq->name;
  if (me.type == TSDB_CHILD_TABLE) {
    me.ctbEntry.ctime = pReq->ctime;
    me.ctbEntry.ttlDays = pReq->ttl;
    me.ctbEntry.suid = pReq->ctb.suid;
    me.ctbEntry.pTags = pReq->ctb.pTag;
  } else {
    me.ntbEntry.ctime = pReq->ctime;
    me.ntbEntry.ttlDays = pReq->ttl;
248 249
    me.ntbEntry.schemaRow = pReq->ntb.schemaRow;
    me.ntbEntry.ncid = me.ntbEntry.schemaRow.pSchema[me.ntbEntry.schemaRow.nCols - 1].colId + 1;
H
more  
Hongze Cheng 已提交
250 251
  }

H
Hongze Cheng 已提交
252
  if (metaHandleEntry(pMeta, &me) < 0) goto _err;
H
Hongze Cheng 已提交
253

H
Hongze Cheng 已提交
254 255
  metaDebug("vgId:%d table %s uid %" PRId64 " is created, type:%" PRId8, TD_VID(pMeta->pVnode), pReq->name, pReq->uid,
            pReq->type);
H
refact  
Hongze Cheng 已提交
256
  return 0;
H
Hongze Cheng 已提交
257 258 259 260 261

_err:
  metaError("vgId:%d failed to create table:%s type:%s since %s", TD_VID(pMeta->pVnode), pReq->name,
            pReq->type == TSDB_CHILD_TABLE ? "child table" : "normal table", tstrerror(terrno));
  return -1;
H
refact  
Hongze Cheng 已提交
262 263
}

264
int metaDropTable(SMeta *pMeta, int64_t version, SVDropTbReq *pReq, SArray *tbUids) {
H
Hongze Cheng 已提交
265 266 267 268 269
  void    *pData = NULL;
  int      nData = 0;
  int      rc = 0;
  tb_uid_t uid;
  int      type;
H
more  
Hongze Cheng 已提交
270

H
Hongze Cheng 已提交
271 272 273
  rc = tdbTbGet(pMeta->pNameIdx, pReq->name, strlen(pReq->name) + 1, &pData, &nData);
  if (rc < 0) {
    terrno = TSDB_CODE_VND_TABLE_NOT_EXIST;
H
more  
Hongze Cheng 已提交
274 275
    return -1;
  }
H
Hongze Cheng 已提交
276 277
  uid = *(tb_uid_t *)pData;

H
Hongze Cheng 已提交
278 279 280
  metaWLock(pMeta);
  metaDropTableByUid(pMeta, uid, &type);
  metaULock(pMeta);
H
Hongze Cheng 已提交
281

H
Hongze Cheng 已提交
282 283
  if (type == TSDB_CHILD_TABLE && tbUids) {
    taosArrayPush(tbUids, &uid);
H
Hongze Cheng 已提交
284
  }
H
Hongze Cheng 已提交
285

H
Hongze Cheng 已提交
286 287 288
  tdbFree(pData);
  return 0;
}
H
Hongze Cheng 已提交
289

H
Hongze Cheng 已提交
290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317
static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) {
  void      *pData = NULL;
  int        nData = 0;
  int        rc = 0;
  int64_t    version;
  SMetaEntry e = {0};
  SDecoder   dc = {0};

  rc = tdbTbGet(pMeta->pUidIdx, &uid, sizeof(uid), &pData, &nData);
  version = *(int64_t *)pData;

  tdbTbGet(pMeta->pTbDb, &(STbDbKey){.version = version, .uid = uid}, sizeof(STbDbKey), &pData, &nData);

  tDecoderInit(&dc, pData, nData);
  metaDecodeEntry(&dc, &e);

  if (type) *type = e.type;

  tdbTbDelete(pMeta->pTbDb, &(STbDbKey){.version = version, .uid = uid}, sizeof(STbDbKey), &pMeta->txn);
  tdbTbDelete(pMeta->pNameIdx, e.name, strlen(e.name) + 1, &pMeta->txn);
  tdbTbDelete(pMeta->pUidIdx, &uid, sizeof(uid), &pMeta->txn);
  if (e.type == TSDB_CHILD_TABLE) {
    tdbTbDelete(pMeta->pCtbIdx, &(SCtbIdxKey){.suid = e.ctbEntry.suid, .uid = uid}, sizeof(SCtbIdxKey), &pMeta->txn);
  } else if (e.type == TSDB_NORMAL_TABLE) {
    // drop schema.db (todo)
    // drop ttl.idx (todo)
  } else if (e.type == TSDB_SUPER_TABLE) {
    // drop schema.db (todo)
H
Hongze Cheng 已提交
318 319
  }

H
Hongze Cheng 已提交
320 321
  tDecoderClear(&dc);
  tdbFree(pData);
H
Hongze Cheng 已提交
322

H
refact  
Hongze Cheng 已提交
323 324
  return 0;
}
H
Hongze Cheng 已提交
325

H
Hongze Cheng 已提交
326
static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterTbReq) {
H
Hongze Cheng 已提交
327
  void           *pVal = NULL;
H
Hongze Cheng 已提交
328
  int             nVal = 0;
H
Hongze Cheng 已提交
329
  const void     *pData = NULL;
H
Hongze Cheng 已提交
330 331 332 333
  int             nData = 0;
  int             ret = 0;
  tb_uid_t        uid;
  int64_t         oversion;
H
Hongze Cheng 已提交
334
  SSchema        *pColumn = NULL;
H
Hongze Cheng 已提交
335 336 337 338 339
  SMetaEntry      entry = {0};
  SSchemaWrapper *pSchema;
  int             c;

  // search name index
H
Hongze Cheng 已提交
340
  ret = tdbTbGet(pMeta->pNameIdx, pAlterTbReq->tbName, strlen(pAlterTbReq->tbName) + 1, &pVal, &nVal);
H
Hongze Cheng 已提交
341 342 343 344 345 346 347 348 349 350
  if (ret < 0) {
    terrno = TSDB_CODE_VND_TABLE_NOT_EXIST;
    return -1;
  }

  uid = *(tb_uid_t *)pVal;
  tdbFree(pVal);
  pVal = NULL;

  // search uid index
H
Hongze Cheng 已提交
351
  TBC *pUidIdxc = NULL;
H
Hongze Cheng 已提交
352

H
Hongze Cheng 已提交
353 354
  tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, &pMeta->txn);
  tdbTbcMoveTo(pUidIdxc, &uid, sizeof(uid), &c);
H
Hongze Cheng 已提交
355 356
  ASSERT(c == 0);

H
Hongze Cheng 已提交
357
  tdbTbcGet(pUidIdxc, NULL, NULL, &pData, &nData);
H
Hongze Cheng 已提交
358 359 360
  oversion = *(int64_t *)pData;

  // search table.db
H
Hongze Cheng 已提交
361
  TBC *pTbDbc = NULL;
H
Hongze Cheng 已提交
362

H
Hongze Cheng 已提交
363 364
  tdbTbcOpen(pMeta->pTbDb, &pTbDbc, &pMeta->txn);
  tdbTbcMoveTo(pTbDbc, &((STbDbKey){.uid = uid, .version = oversion}), sizeof(STbDbKey), &c);
H
Hongze Cheng 已提交
365
  ASSERT(c == 0);
H
Hongze Cheng 已提交
366
  tdbTbcGet(pTbDbc, NULL, NULL, &pData, &nData);
H
Hongze Cheng 已提交
367 368 369

  // get table entry
  SDecoder dc = {0};
H
Hongze Cheng 已提交
370 371 372
  entry.pBuf = taosMemoryMalloc(nData);
  memcpy(entry.pBuf, pData, nData);
  tDecoderInit(&dc, entry.pBuf, nData);
H
Hongze Cheng 已提交
373 374
  ret = metaDecodeEntry(&dc, &entry);
  ASSERT(ret == 0);
H
Hongze Cheng 已提交
375 376 377 378 379 380 381

  if (entry.type != TSDB_NORMAL_TABLE) {
    terrno = TSDB_CODE_VND_INVALID_TABLE_ACTION;
    goto _err;
  }

  // search the column to add/drop/update
382
  pSchema = &entry.ntbEntry.schemaRow;
H
Hongze Cheng 已提交
383 384 385 386 387 388 389 390 391 392 393 394
  int32_t iCol = 0;
  for (;;) {
    pColumn = NULL;

    if (iCol >= pSchema->nCols) break;
    pColumn = &pSchema->pSchema[iCol];

    if (strcmp(pColumn->name, pAlterTbReq->colName) == 0) break;
    iCol++;
  }

  entry.version = version;
H
Hongze Cheng 已提交
395 396
  int      tlen;
  SSchema *pNewSchema = NULL;
H
Hongze Cheng 已提交
397 398 399 400 401 402
  switch (pAlterTbReq->action) {
    case TSDB_ALTER_TABLE_ADD_COLUMN:
      if (pColumn) {
        terrno = TSDB_CODE_VND_COL_ALREADY_EXISTS;
        goto _err;
      }
403
      pSchema->version++;
H
Hongze Cheng 已提交
404
      pSchema->nCols++;
H
Hongze Cheng 已提交
405 406 407
      pNewSchema = taosMemoryMalloc(sizeof(SSchema) * pSchema->nCols);
      memcpy(pNewSchema, pSchema->pSchema, sizeof(SSchema) * (pSchema->nCols - 1));
      pSchema->pSchema = pNewSchema;
408 409 410 411 412
      pSchema->pSchema[entry.ntbEntry.schemaRow.nCols - 1].bytes = pAlterTbReq->bytes;
      pSchema->pSchema[entry.ntbEntry.schemaRow.nCols - 1].type = pAlterTbReq->type;
      pSchema->pSchema[entry.ntbEntry.schemaRow.nCols - 1].flags = pAlterTbReq->flags;
      pSchema->pSchema[entry.ntbEntry.schemaRow.nCols - 1].colId = entry.ntbEntry.ncid++;
      strcpy(pSchema->pSchema[entry.ntbEntry.schemaRow.nCols - 1].name, pAlterTbReq->colName);
H
Hongze Cheng 已提交
413 414 415 416 417 418 419 420 421 422
      break;
    case TSDB_ALTER_TABLE_DROP_COLUMN:
      if (pColumn == NULL) {
        terrno = TSDB_CODE_VND_TABLE_COL_NOT_EXISTS;
        goto _err;
      }
      if (pColumn->colId == 0) {
        terrno = TSDB_CODE_VND_INVALID_TABLE_ACTION;
        goto _err;
      }
423
      pSchema->version++;
H
Hongze Cheng 已提交
424 425 426 427
      tlen = (pSchema->nCols - iCol - 1) * sizeof(SSchema);
      if (tlen) {
        memmove(pColumn, pColumn + 1, tlen);
      }
H
Hongze Cheng 已提交
428
      pSchema->nCols--;
H
Hongze Cheng 已提交
429 430 431 432 433 434
      break;
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES:
      if (pColumn == NULL) {
        terrno = TSDB_CODE_VND_TABLE_COL_NOT_EXISTS;
        goto _err;
      }
H
Hongze Cheng 已提交
435
      if (!IS_VAR_DATA_TYPE(pColumn->type) || pColumn->bytes > pAlterTbReq->colModBytes) {
H
Hongze Cheng 已提交
436 437 438
        terrno = TSDB_CODE_VND_INVALID_TABLE_ACTION;
        goto _err;
      }
439
      pSchema->version++;
H
Hongze Cheng 已提交
440
      pColumn->bytes = pAlterTbReq->colModBytes;
H
Hongze Cheng 已提交
441 442 443 444 445 446
      break;
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME:
      if (pColumn == NULL) {
        terrno = TSDB_CODE_VND_TABLE_COL_NOT_EXISTS;
        goto _err;
      }
447
      pSchema->version++;
H
Hongze Cheng 已提交
448 449 450 451 452 453
      strcpy(pColumn->name, pAlterTbReq->colNewName);
      break;
  }

  entry.version = version;

H
Hongze Cheng 已提交
454 455 456 457 458 459
  // do actual write
  metaWLock(pMeta);

  // save to table db
  metaSaveToTbDb(pMeta, &entry);

H
Hongze Cheng 已提交
460
  tdbTbcUpsert(pUidIdxc, &entry.uid, sizeof(tb_uid_t), &version, sizeof(version), 0);
H
Hongze Cheng 已提交
461 462 463 464 465

  metaSaveToSkmDb(pMeta, &entry);

  metaULock(pMeta);

H
Hongze Cheng 已提交
466
  if (pNewSchema) taosMemoryFree(pNewSchema);
H
Hongze Cheng 已提交
467
  tDecoderClear(&dc);
H
Hongze Cheng 已提交
468 469
  tdbTbcClose(pTbDbc);
  tdbTbcClose(pUidIdxc);
H
Hongze Cheng 已提交
470
  return 0;
H
Hongze Cheng 已提交
471 472 473

_err:
  tDecoderClear(&dc);
H
Hongze Cheng 已提交
474 475
  tdbTbcClose(pTbDbc);
  tdbTbcClose(pUidIdxc);
H
Hongze Cheng 已提交
476
  return -1;
H
Hongze Cheng 已提交
477 478 479
}

static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterTbReq) {
H
Hongze Cheng 已提交
480 481
  SMetaEntry  ctbEntry = {0};
  SMetaEntry  stbEntry = {0};
H
Hongze Cheng 已提交
482
  void       *pVal = NULL;
H
Hongze Cheng 已提交
483 484 485 486 487 488 489 490 491
  int         nVal = 0;
  int         ret;
  int         c;
  tb_uid_t    uid;
  int64_t     oversion;
  const void *pData = NULL;
  int         nData = 0;

  // search name index
H
Hongze Cheng 已提交
492
  ret = tdbTbGet(pMeta->pNameIdx, pAlterTbReq->tbName, strlen(pAlterTbReq->tbName) + 1, &pVal, &nVal);
H
Hongze Cheng 已提交
493 494 495 496 497 498 499 500 501 502
  if (ret < 0) {
    terrno = TSDB_CODE_VND_TABLE_NOT_EXIST;
    return -1;
  }

  uid = *(tb_uid_t *)pVal;
  tdbFree(pVal);
  pVal = NULL;

  // search uid index
H
Hongze Cheng 已提交
503
  TBC *pUidIdxc = NULL;
H
Hongze Cheng 已提交
504

H
Hongze Cheng 已提交
505 506
  tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, &pMeta->txn);
  tdbTbcMoveTo(pUidIdxc, &uid, sizeof(uid), &c);
H
Hongze Cheng 已提交
507 508
  ASSERT(c == 0);

H
Hongze Cheng 已提交
509
  tdbTbcGet(pUidIdxc, NULL, NULL, &pData, &nData);
H
Hongze Cheng 已提交
510 511 512
  oversion = *(int64_t *)pData;

  // search table.db
H
Hongze Cheng 已提交
513
  TBC     *pTbDbc = NULL;
H
Hongze Cheng 已提交
514 515
  SDecoder dc1 = {0};
  SDecoder dc2 = {0};
H
Hongze Cheng 已提交
516

H
Hongze Cheng 已提交
517
  /* get ctbEntry */
H
Hongze Cheng 已提交
518 519
  tdbTbcOpen(pMeta->pTbDb, &pTbDbc, &pMeta->txn);
  tdbTbcMoveTo(pTbDbc, &((STbDbKey){.uid = uid, .version = oversion}), sizeof(STbDbKey), &c);
H
Hongze Cheng 已提交
520
  ASSERT(c == 0);
H
Hongze Cheng 已提交
521
  tdbTbcGet(pTbDbc, NULL, NULL, &pData, &nData);
H
Hongze Cheng 已提交
522

H
Hongze Cheng 已提交
523 524
  ctbEntry.pBuf = taosMemoryMalloc(nData);
  memcpy(ctbEntry.pBuf, pData, nData);
H
Hongze Cheng 已提交
525 526
  tDecoderInit(&dc1, ctbEntry.pBuf, nData);
  metaDecodeEntry(&dc1, &ctbEntry);
H
Hongze Cheng 已提交
527

H
Hongze Cheng 已提交
528
  /* get stbEntry*/
H
Hongze Cheng 已提交
529 530 531
  tdbTbGet(pMeta->pUidIdx, &ctbEntry.ctbEntry.suid, sizeof(tb_uid_t), &pVal, &nVal);
  tdbTbGet(pMeta->pTbDb, &((STbDbKey){.uid = ctbEntry.ctbEntry.suid, .version = *(int64_t *)pVal}), sizeof(STbDbKey),
           (void **)&stbEntry.pBuf, &nVal);
H
Hongze Cheng 已提交
532
  tdbFree(pVal);
H
Hongze Cheng 已提交
533 534
  tDecoderInit(&dc2, stbEntry.pBuf, nVal);
  metaDecodeEntry(&dc2, &stbEntry);
H
Hongze Cheng 已提交
535 536

  SSchemaWrapper *pTagSchema = &stbEntry.stbEntry.schemaTag;
H
Hongze Cheng 已提交
537
  SSchema        *pColumn = NULL;
H
Hongze Cheng 已提交
538 539 540 541 542 543 544 545 546 547 548 549 550 551 552
  int32_t         iCol = 0;
  for (;;) {
    pColumn = NULL;

    if (iCol >= pTagSchema->nCols) break;
    pColumn = &pTagSchema->pSchema[iCol];

    if (strcmp(pColumn->name, pAlterTbReq->tagName) == 0) break;
    iCol++;
  }

  if (pColumn == NULL) {
    terrno = TSDB_CODE_VND_TABLE_COL_NOT_EXISTS;
    goto _err;
  }
H
Hongze Cheng 已提交
553

H
Hongze Cheng 已提交
554 555
  if (iCol == 0) {
    // TODO : need to update tag index
H
Hongze Cheng 已提交
556
  }
H
Hongze Cheng 已提交
557
  ctbEntry.version = version;
H
Hongze Cheng 已提交
558
  if (pTagSchema->nCols == 1 && pTagSchema->pSchema[0].type == TSDB_DATA_TYPE_JSON) {
wmmhello's avatar
wmmhello 已提交
559
    ctbEntry.ctbEntry.pTags = taosMemoryMalloc(pAlterTbReq->nTagVal);
H
Hongze Cheng 已提交
560
    if (ctbEntry.ctbEntry.pTags == NULL) {
wmmhello's avatar
wmmhello 已提交
561 562 563
      terrno = TSDB_CODE_OUT_OF_MEMORY;
      goto _err;
    }
H
Hongze Cheng 已提交
564 565
    memcpy((void *)ctbEntry.ctbEntry.pTags, pAlterTbReq->pTagVal, pAlterTbReq->nTagVal);
  } else {
C
Cary Xu 已提交
566 567
    const STag *pOldTag = (const STag *)ctbEntry.ctbEntry.pTags;
    STag       *pNewTag = NULL;
C
Cary Xu 已提交
568 569
    SArray     *pTagArray = taosArrayInit(pTagSchema->nCols, sizeof(STagVal));
    if (!pTagArray) {
C
Cary Xu 已提交
570 571 572
      terrno = TSDB_CODE_OUT_OF_MEMORY;
      goto _err;
    }
wmmhello's avatar
wmmhello 已提交
573 574 575
    for (int32_t i = 0; i < pTagSchema->nCols; i++) {
      SSchema *pCol = &pTagSchema->pSchema[i];
      if (iCol == i) {
C
Cary Xu 已提交
576
        tTagValPush(pTagArray, &pCol->colId, pCol->type, pAlterTbReq->pTagVal, pAlterTbReq->nTagVal, false);
wmmhello's avatar
wmmhello 已提交
577
      } else {
C
Cary Xu 已提交
578 579
        STagVal tagVal = {.cid = pCol->colId};
        if (tTagGet(pOldTag, &tagVal) && tagVal.pData) {
wmmhello's avatar
wmmhello 已提交
580
          if (IS_VAR_DATA_TYPE(pCol->type)) {
C
Cary Xu 已提交
581
            tTagValPush(pTagArray, &pCol->colId, pCol->type, varDataVal(tagVal.pData), varDataLen(tagVal.pData), false);
wmmhello's avatar
wmmhello 已提交
582
          } else {
C
Cary Xu 已提交
583
            tTagValPush(pTagArray, &pCol->colId, pCol->type, tagVal.pData, pCol->bytes, false);
wmmhello's avatar
wmmhello 已提交
584
          }
H
Hongze Cheng 已提交
585 586 587
        }
      }
    }
C
Cary Xu 已提交
588 589
    if ((terrno = tTagNew(pTagArray, pTagSchema->version, false, &pNewTag)) < 0) {
      taosArrayDestroy(pTagArray);
C
Cary Xu 已提交
590 591 592
      goto _err;
    }
    ctbEntry.ctbEntry.pTags = (uint8_t *)pNewTag;
C
Cary Xu 已提交
593
    taosArrayDestroy(pTagArray);
wmmhello's avatar
wmmhello 已提交
594
  }
H
Hongze Cheng 已提交
595 596 597 598 599

  // save to table.db
  metaSaveToTbDb(pMeta, &ctbEntry);

  // save to uid.idx
H
Hongze Cheng 已提交
600
  tdbTbUpsert(pMeta->pUidIdx, &ctbEntry.uid, sizeof(tb_uid_t), &version, sizeof(version), &pMeta->txn);
H
Hongze Cheng 已提交
601

H
Hongze Cheng 已提交
602 603
  tDecoderClear(&dc1);
  tDecoderClear(&dc2);
H
Hongze Cheng 已提交
604
  if (ctbEntry.ctbEntry.pTags) taosMemoryFree((void *)ctbEntry.ctbEntry.pTags);
H
Hongze Cheng 已提交
605 606
  if (ctbEntry.pBuf) taosMemoryFree(ctbEntry.pBuf);
  if (stbEntry.pBuf) tdbFree(stbEntry.pBuf);
H
Hongze Cheng 已提交
607 608
  tdbTbcClose(pTbDbc);
  tdbTbcClose(pUidIdxc);
H
Hongze Cheng 已提交
609
  return 0;
H
Hongze Cheng 已提交
610 611

_err:
H
Hongze Cheng 已提交
612 613
  tDecoderClear(&dc1);
  tDecoderClear(&dc2);
H
Hongze Cheng 已提交
614 615
  if (ctbEntry.pBuf) taosMemoryFree(ctbEntry.pBuf);
  if (stbEntry.pBuf) tdbFree(stbEntry.pBuf);
H
Hongze Cheng 已提交
616 617
  tdbTbcClose(pTbDbc);
  tdbTbcClose(pUidIdxc);
H
Hongze Cheng 已提交
618
  return -1;
H
Hongze Cheng 已提交
619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644
}

static int metaUpdateTableOptions(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterTbReq) {
  // TODO
  ASSERT(0);
  return 0;
}

int metaAlterTable(SMeta *pMeta, int64_t version, SVAlterTbReq *pReq) {
  switch (pReq->action) {
    case TSDB_ALTER_TABLE_ADD_COLUMN:
    case TSDB_ALTER_TABLE_DROP_COLUMN:
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES:
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME:
      return metaAlterTableColumn(pMeta, version, pReq);
    case TSDB_ALTER_TABLE_UPDATE_TAG_VAL:
      return metaUpdateTableTagVal(pMeta, version, pReq);
    case TSDB_ALTER_TABLE_UPDATE_OPTIONS:
      return metaUpdateTableOptions(pMeta, version, pReq);
    default:
      terrno = TSDB_CODE_VND_INVALID_TABLE_ACTION;
      return -1;
      break;
  }
}

H
Hongze Cheng 已提交
645
static int metaSaveToTbDb(SMeta *pMeta, const SMetaEntry *pME) {
H
Hongze Cheng 已提交
646
  STbDbKey tbDbKey;
H
Hongze Cheng 已提交
647 648
  void    *pKey = NULL;
  void    *pVal = NULL;
H
Hongze Cheng 已提交
649 650
  int      kLen = 0;
  int      vLen = 0;
H
Hongze Cheng 已提交
651
  SEncoder coder = {0};
H
Hongze Cheng 已提交
652 653

  // set key and value
H
Hongze Cheng 已提交
654
  tbDbKey.version = pME->version;
H
Hongze Cheng 已提交
655 656 657 658
  tbDbKey.uid = pME->uid;

  pKey = &tbDbKey;
  kLen = sizeof(tbDbKey);
H
Hongze Cheng 已提交
659

wafwerar's avatar
wafwerar 已提交
660 661 662
  int32_t ret = 0;
  tEncodeSize(metaEncodeEntry, pME, vLen, ret);
  if (ret < 0) {
H
Hongze Cheng 已提交
663 664 665 666 667 668 669 670 671
    goto _err;
  }

  pVal = taosMemoryMalloc(vLen);
  if (pVal == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    goto _err;
  }

H
Hongze Cheng 已提交
672
  tEncoderInit(&coder, pVal, vLen);
H
Hongze Cheng 已提交
673 674 675 676 677

  if (metaEncodeEntry(&coder, pME) < 0) {
    goto _err;
  }

H
Hongze Cheng 已提交
678
  tEncoderClear(&coder);
H
Hongze Cheng 已提交
679 680

  // write to table.db
H
Hongze Cheng 已提交
681
  if (tdbTbInsert(pMeta->pTbDb, pKey, kLen, pVal, vLen, &pMeta->txn) < 0) {
H
Hongze Cheng 已提交
682 683 684 685 686 687 688 689 690 691 692
    goto _err;
  }

  taosMemoryFree(pVal);
  return 0;

_err:
  taosMemoryFree(pVal);
  return -1;
}

H
Hongze Cheng 已提交
693
static int metaUpdateUidIdx(SMeta *pMeta, const SMetaEntry *pME) {
H
Hongze Cheng 已提交
694
  return tdbTbInsert(pMeta->pUidIdx, &pME->uid, sizeof(tb_uid_t), &pME->version, sizeof(int64_t), &pMeta->txn);
H
Hongze Cheng 已提交
695 696
}

H
Hongze Cheng 已提交
697
static int metaUpdateNameIdx(SMeta *pMeta, const SMetaEntry *pME) {
H
Hongze Cheng 已提交
698
  return tdbTbInsert(pMeta->pNameIdx, pME->name, strlen(pME->name) + 1, &pME->uid, sizeof(tb_uid_t), &pMeta->txn);
H
Hongze Cheng 已提交
699 700
}

H
Hongze Cheng 已提交
701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720
static int metaUpdateTtlIdx(SMeta *pMeta, const SMetaEntry *pME) {
  int32_t    ttlDays;
  int64_t    ctime;
  STtlIdxKey ttlKey;

  if (pME->type == TSDB_CHILD_TABLE) {
    ctime = pME->ctbEntry.ctime;
    ttlDays = pME->ctbEntry.ttlDays;
  } else if (pME->type == TSDB_NORMAL_TABLE) {
    ctime = pME->ntbEntry.ctime;
    ttlDays = pME->ntbEntry.ttlDays;
  } else {
    ASSERT(0);
  }

  if (ttlDays <= 0) return 0;

  ttlKey.dtime = ctime + ttlDays * 24 * 60 * 60;
  ttlKey.uid = pME->uid;

H
Hongze Cheng 已提交
721
  return tdbTbInsert(pMeta->pTtlIdx, &ttlKey, sizeof(ttlKey), NULL, 0, &pMeta->txn);
H
Hongze Cheng 已提交
722 723
}

H
Hongze Cheng 已提交
724 725
static int metaUpdateCtbIdx(SMeta *pMeta, const SMetaEntry *pME) {
  SCtbIdxKey ctbIdxKey = {.suid = pME->ctbEntry.suid, .uid = pME->uid};
H
Hongze Cheng 已提交
726
  return tdbTbInsert(pMeta->pCtbIdx, &ctbIdxKey, sizeof(ctbIdxKey), NULL, 0, &pMeta->txn);
H
Hongze Cheng 已提交
727 728
}

C
Cary Xu 已提交
729
static int metaCreateTagIdxKey(tb_uid_t suid, int32_t cid, const void *pTagData, int32_t nTagData, int8_t type, tb_uid_t uid,
H
Hongze Cheng 已提交
730
                               STagIdxKey **ppTagIdxKey, int32_t *nTagIdxKey) {
C
Cary Xu 已提交
731 732 733 734 735 736 737 738 739
  // int32_t nTagData = 0;

  // if (pTagData) {
  //   if (IS_VAR_DATA_TYPE(type)) {
  //     nTagData = varDataTLen(pTagData);
  //   } else {
  //     nTagData = tDataTypes[type].bytes;
  //   }
  // }
H
Hongze Cheng 已提交
740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762
  *nTagIdxKey = sizeof(STagIdxKey) + nTagData + sizeof(tb_uid_t);

  *ppTagIdxKey = (STagIdxKey *)taosMemoryMalloc(*nTagIdxKey);
  if (*ppTagIdxKey == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    return -1;
  }

  (*ppTagIdxKey)->suid = suid;
  (*ppTagIdxKey)->cid = cid;
  (*ppTagIdxKey)->isNull = (pTagData == NULL) ? 1 : 0;
  (*ppTagIdxKey)->type = type;
  if (nTagData) memcpy((*ppTagIdxKey)->data, pTagData, nTagData);
  *(tb_uid_t *)((*ppTagIdxKey)->data + nTagData) = uid;

  return 0;
}

static void metaDestroyTagIdxKey(STagIdxKey *pTagIdxKey) {
  if (pTagIdxKey) taosMemoryFree(pTagIdxKey);
}

static int metaUpdateTagIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry) {
H
Hongze Cheng 已提交
763
  void          *pData = NULL;
H
Hongze Cheng 已提交
764 765 766
  int            nData = 0;
  STbDbKey       tbDbKey = {0};
  SMetaEntry     stbEntry = {0};
H
Hongze Cheng 已提交
767
  STagIdxKey    *pTagIdxKey = NULL;
H
Hongze Cheng 已提交
768 769
  int32_t        nTagIdxKey;
  const SSchema *pTagColumn;       // = &stbEntry.stbEntry.schema.pSchema[0];
H
Hongze Cheng 已提交
770
  const void    *pTagData = NULL;  //
C
Cary Xu 已提交
771
  int32_t        nTagData = 0;
H
Hongze Cheng 已提交
772 773 774
  SDecoder       dc = {0};

  // get super table
H
Hongze Cheng 已提交
775
  tdbTbGet(pMeta->pUidIdx, &pCtbEntry->ctbEntry.suid, sizeof(tb_uid_t), &pData, &nData);
H
Hongze Cheng 已提交
776 777
  tbDbKey.uid = pCtbEntry->ctbEntry.suid;
  tbDbKey.version = *(int64_t *)pData;
H
Hongze Cheng 已提交
778
  tdbTbGet(pMeta->pTbDb, &tbDbKey, sizeof(tbDbKey), &pData, &nData);
H
Hongze Cheng 已提交
779 780 781 782 783

  tDecoderInit(&dc, pData, nData);
  metaDecodeEntry(&dc, &stbEntry);

  pTagColumn = &stbEntry.stbEntry.schemaTag.pSchema[0];
C
Cary Xu 已提交
784 785 786 787

  STagVal tagVal = {.cid = pTagColumn->colId};
  tTagGet((const STag *)pCtbEntry->ctbEntry.pTags, &tagVal);
  pTagData = tagVal.pData;
C
Cary Xu 已提交
788
  nTagData = (int32_t)tagVal.nData;
H
Hongze Cheng 已提交
789 790

  // update tag index
dengyihao's avatar
dengyihao 已提交
791 792 793 794 795 796 797 798 799 800 801 802
#ifdef USE_INVERTED_INDEX
  tb_uid_t suid = pCtbEntry->ctbEntry.suid;
  tb_uid_t tuid = pCtbEntry->uid;

  SIndexMultiTerm *tmGroup = indexMultiTermCreate();

  SIndexTerm *tm = indexTermCreate(suid, ADD_VALUE, pTagColumn->type, pTagColumn->name, sizeof(pTagColumn->name),
                                   pTagData, pTagData == NULL ? 0 : strlen(pTagData));
  indexMultiTermAdd(tmGroup, tm);
  int ret = indexPut((SIndex *)pMeta->pTagIvtIdx, tmGroup, tuid);
  indexMultiTermDestroy(tmGroup);
#else
C
Cary Xu 已提交
803
  if (metaCreateTagIdxKey(pCtbEntry->ctbEntry.suid, pTagColumn->colId, pTagData, nTagData, pTagColumn->type, pCtbEntry->uid,
H
Hongze Cheng 已提交
804 805 806
                          &pTagIdxKey, &nTagIdxKey) < 0) {
    return -1;
  }
H
Hongze Cheng 已提交
807
  tdbTbInsert(pMeta->pTagIdx, pTagIdxKey, nTagIdxKey, NULL, 0, &pMeta->txn);
H
Hongze Cheng 已提交
808
  metaDestroyTagIdxKey(pTagIdxKey);
dengyihao's avatar
dengyihao 已提交
809
#endif
H
Hongze Cheng 已提交
810 811
  tDecoderClear(&dc);
  tdbFree(pData);
H
Hongze Cheng 已提交
812 813 814
  return 0;
}

H
Hongze Cheng 已提交
815
static int metaSaveToSkmDb(SMeta *pMeta, const SMetaEntry *pME) {
H
Hongze Cheng 已提交
816
  SEncoder              coder = {0};
H
Hongze Cheng 已提交
817
  void                 *pVal = NULL;
H
Hongze Cheng 已提交
818 819 820 821 822 823
  int                   vLen = 0;
  int                   rcode = 0;
  SSkmDbKey             skmDbKey = {0};
  const SSchemaWrapper *pSW;

  if (pME->type == TSDB_SUPER_TABLE) {
824
    pSW = &pME->stbEntry.schemaRow;
H
Hongze Cheng 已提交
825
  } else if (pME->type == TSDB_NORMAL_TABLE) {
826
    pSW = &pME->ntbEntry.schemaRow;
H
Hongze Cheng 已提交
827 828
  } else {
    ASSERT(0);
H
Hongze Cheng 已提交
829 830
  }

H
Hongze Cheng 已提交
831
  skmDbKey.uid = pME->uid;
832
  skmDbKey.sver = pSW->version;
H
Hongze Cheng 已提交
833 834

  // encode schema
wafwerar's avatar
wafwerar 已提交
835 836 837
  int32_t ret = 0;
  tEncodeSize(tEncodeSSchemaWrapper, pSW, vLen, ret);
  if (ret < 0) return -1;
H
Hongze Cheng 已提交
838
  pVal = taosMemoryMalloc(vLen);
H
Hongze Cheng 已提交
839 840 841 842 843 844
  if (pVal == NULL) {
    rcode = -1;
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    goto _exit;
  }

H
Hongze Cheng 已提交
845
  tEncoderInit(&coder, pVal, vLen);
H
Hongze Cheng 已提交
846 847
  tEncodeSSchemaWrapper(&coder, pSW);

H
Hongze Cheng 已提交
848
  if (tdbTbInsert(pMeta->pSkmDb, &skmDbKey, sizeof(skmDbKey), pVal, vLen, &pMeta->txn) < 0) {
H
Hongze Cheng 已提交
849 850 851 852 853
    rcode = -1;
    goto _exit;
  }

_exit:
H
Hongze Cheng 已提交
854
  taosMemoryFree(pVal);
H
Hongze Cheng 已提交
855
  tEncoderClear(&coder);
H
Hongze Cheng 已提交
856 857 858 859
  return rcode;
}

static int metaHandleEntry(SMeta *pMeta, const SMetaEntry *pME) {
H
Hongze Cheng 已提交
860 861
  metaWLock(pMeta);

H
Hongze Cheng 已提交
862
  // save to table.db
H
Hongze Cheng 已提交
863
  if (metaSaveToTbDb(pMeta, pME) < 0) goto _err;
H
Hongze Cheng 已提交
864 865

  // update uid.idx
H
Hongze Cheng 已提交
866
  if (metaUpdateUidIdx(pMeta, pME) < 0) goto _err;
H
Hongze Cheng 已提交
867 868

  // update name.idx
H
Hongze Cheng 已提交
869
  if (metaUpdateNameIdx(pMeta, pME) < 0) goto _err;
H
Hongze Cheng 已提交
870 871 872

  if (pME->type == TSDB_CHILD_TABLE) {
    // update ctb.idx
H
Hongze Cheng 已提交
873
    if (metaUpdateCtbIdx(pMeta, pME) < 0) goto _err;
H
Hongze Cheng 已提交
874 875

    // update tag.idx
H
Hongze Cheng 已提交
876
    if (metaUpdateTagIdx(pMeta, pME) < 0) goto _err;
H
Hongze Cheng 已提交
877 878
  } else {
    // update schema.db
H
Hongze Cheng 已提交
879
    if (metaSaveToSkmDb(pMeta, pME) < 0) goto _err;
H
Hongze Cheng 已提交
880 881 882
  }

  if (pME->type != TSDB_SUPER_TABLE) {
H
Hongze Cheng 已提交
883
    if (metaUpdateTtlIdx(pMeta, pME) < 0) goto _err;
H
Hongze Cheng 已提交
884 885
  }

H
Hongze Cheng 已提交
886
  metaULock(pMeta);
H
Hongze Cheng 已提交
887
  return 0;
H
Hongze Cheng 已提交
888 889 890 891

_err:
  metaULock(pMeta);
  return -1;
892
}