metaTable.c 25.7 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) {
wmmhello's avatar
wmmhello 已提交
576 577 578 579 580 581
        STagVal val = {0};
        val.type = pCol->type;
        val.cid = pCol->colId;
        if (IS_VAR_DATA_TYPE(pCol->type)) {
          val.pData = pAlterTbReq->pTagVal;
          val.nData = pAlterTbReq->nTagVal;
582
        } else {
wmmhello's avatar
wmmhello 已提交
583 584 585
          memcpy(&val.i64, pAlterTbReq->pTagVal, pAlterTbReq->nTagVal);
        }
        taosArrayPush(pTagArray, &val);
wmmhello's avatar
wmmhello 已提交
586
      } else {
wmmhello's avatar
wmmhello 已提交
587 588 589
        STagVal val = {0};
        if (tTagGet(pOldTag, &val)) {
          taosArrayPush(pTagArray, &val);
H
Hongze Cheng 已提交
590 591 592
        }
      }
    }
C
Cary Xu 已提交
593 594
    if ((terrno = tTagNew(pTagArray, pTagSchema->version, false, &pNewTag)) < 0) {
      taosArrayDestroy(pTagArray);
C
Cary Xu 已提交
595 596 597
      goto _err;
    }
    ctbEntry.ctbEntry.pTags = (uint8_t *)pNewTag;
C
Cary Xu 已提交
598
    taosArrayDestroy(pTagArray);
wmmhello's avatar
wmmhello 已提交
599
  }
H
Hongze Cheng 已提交
600 601 602 603 604

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

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

H
Hongze Cheng 已提交
607 608
  tDecoderClear(&dc1);
  tDecoderClear(&dc2);
H
Hongze Cheng 已提交
609
  if (ctbEntry.ctbEntry.pTags) taosMemoryFree((void *)ctbEntry.ctbEntry.pTags);
H
Hongze Cheng 已提交
610 611
  if (ctbEntry.pBuf) taosMemoryFree(ctbEntry.pBuf);
  if (stbEntry.pBuf) tdbFree(stbEntry.pBuf);
H
Hongze Cheng 已提交
612 613
  tdbTbcClose(pTbDbc);
  tdbTbcClose(pUidIdxc);
H
Hongze Cheng 已提交
614
  return 0;
H
Hongze Cheng 已提交
615 616

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

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 已提交
650
static int metaSaveToTbDb(SMeta *pMeta, const SMetaEntry *pME) {
H
Hongze Cheng 已提交
651
  STbDbKey tbDbKey;
H
Hongze Cheng 已提交
652 653
  void    *pKey = NULL;
  void    *pVal = NULL;
H
Hongze Cheng 已提交
654 655
  int      kLen = 0;
  int      vLen = 0;
H
Hongze Cheng 已提交
656
  SEncoder coder = {0};
H
Hongze Cheng 已提交
657 658

  // set key and value
H
Hongze Cheng 已提交
659
  tbDbKey.version = pME->version;
H
Hongze Cheng 已提交
660 661 662 663
  tbDbKey.uid = pME->uid;

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

wafwerar's avatar
wafwerar 已提交
665 666 667
  int32_t ret = 0;
  tEncodeSize(metaEncodeEntry, pME, vLen, ret);
  if (ret < 0) {
H
Hongze Cheng 已提交
668 669 670 671 672 673 674 675 676
    goto _err;
  }

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

H
Hongze Cheng 已提交
677
  tEncoderInit(&coder, pVal, vLen);
H
Hongze Cheng 已提交
678 679 680 681 682

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

H
Hongze Cheng 已提交
683
  tEncoderClear(&coder);
H
Hongze Cheng 已提交
684 685

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

  taosMemoryFree(pVal);
  return 0;

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

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

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

H
Hongze Cheng 已提交
706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725
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 已提交
726
  return tdbTbInsert(pMeta->pTtlIdx, &ttlKey, sizeof(ttlKey), NULL, 0, &pMeta->txn);
H
Hongze Cheng 已提交
727 728
}

H
Hongze Cheng 已提交
729 730
static int metaUpdateCtbIdx(SMeta *pMeta, const SMetaEntry *pME) {
  SCtbIdxKey ctbIdxKey = {.suid = pME->ctbEntry.suid, .uid = pME->uid};
H
Hongze Cheng 已提交
731
  return tdbTbInsert(pMeta->pCtbIdx, &ctbIdxKey, sizeof(ctbIdxKey), NULL, 0, &pMeta->txn);
H
Hongze Cheng 已提交
732 733
}

wmmhello's avatar
wmmhello 已提交
734
int metaCreateTagIdxKey(tb_uid_t suid, int32_t cid, const void *pTagData, int32_t nTagData, int8_t type, tb_uid_t uid,
735
                        STagIdxKey **ppTagIdxKey, int32_t *nTagIdxKey) {
C
Cary Xu 已提交
736
  // int32_t nTagData = 0;
H
Hongze Cheng 已提交
737

C
Cary Xu 已提交
738 739 740 741 742 743 744
  // if (pTagData) {
  //   if (IS_VAR_DATA_TYPE(type)) {
  //     nTagData = varDataTLen(pTagData);
  //   } else {
  //     nTagData = tDataTypes[type].bytes;
  //   }
  // }
H
Hongze Cheng 已提交
745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767
  *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 已提交
768
  void          *pData = NULL;
H
Hongze Cheng 已提交
769 770 771
  int            nData = 0;
  STbDbKey       tbDbKey = {0};
  SMetaEntry     stbEntry = {0};
H
Hongze Cheng 已提交
772
  STagIdxKey    *pTagIdxKey = NULL;
H
Hongze Cheng 已提交
773 774
  int32_t        nTagIdxKey;
  const SSchema *pTagColumn;       // = &stbEntry.stbEntry.schema.pSchema[0];
H
Hongze Cheng 已提交
775
  const void    *pTagData = NULL;  //
C
Cary Xu 已提交
776
  int32_t        nTagData = 0;
H
Hongze Cheng 已提交
777 778 779
  SDecoder       dc = {0};

  // get super table
H
Hongze Cheng 已提交
780
  tdbTbGet(pMeta->pUidIdx, &pCtbEntry->ctbEntry.suid, sizeof(tb_uid_t), &pData, &nData);
H
Hongze Cheng 已提交
781 782
  tbDbKey.uid = pCtbEntry->ctbEntry.suid;
  tbDbKey.version = *(int64_t *)pData;
H
Hongze Cheng 已提交
783
  tdbTbGet(pMeta->pTbDb, &tbDbKey, sizeof(tbDbKey), &pData, &nData);
H
Hongze Cheng 已提交
784 785 786 787 788

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

  pTagColumn = &stbEntry.stbEntry.schemaTag.pSchema[0];
C
Cary Xu 已提交
789 790

  STagVal tagVal = {.cid = pTagColumn->colId};
791
  if (pTagColumn->type != TSDB_DATA_TYPE_JSON) {
wmmhello's avatar
wmmhello 已提交
792
    tTagGet((const STag *)pCtbEntry->ctbEntry.pTags, &tagVal);
793
    if (IS_VAR_DATA_TYPE(pTagColumn->type)) {
wmmhello's avatar
wmmhello 已提交
794 795
      pTagData = tagVal.pData;
      nTagData = (int32_t)tagVal.nData;
796
    } else {
wmmhello's avatar
wmmhello 已提交
797 798 799
      pTagData = &(tagVal.i64);
      nTagData = tDataTypes[pTagColumn->type].bytes;
    }
800 801 802
  } else {
    // pTagData = pCtbEntry->ctbEntry.pTags;
    // nTagData = ((const STag *)pCtbEntry->ctbEntry.pTags)->len;
wmmhello's avatar
wmmhello 已提交
803
  }
H
Hongze Cheng 已提交
804 805

  // update tag index
dengyihao's avatar
dengyihao 已提交
806 807 808 809 810 811 812 813 814 815 816 817
#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
818 819
  if (metaCreateTagIdxKey(pCtbEntry->ctbEntry.suid, pTagColumn->colId, pTagData, nTagData, pTagColumn->type,
                          pCtbEntry->uid, &pTagIdxKey, &nTagIdxKey) < 0) {
H
Hongze Cheng 已提交
820 821
    return -1;
  }
H
Hongze Cheng 已提交
822
  tdbTbInsert(pMeta->pTagIdx, pTagIdxKey, nTagIdxKey, NULL, 0, &pMeta->txn);
H
Hongze Cheng 已提交
823
  metaDestroyTagIdxKey(pTagIdxKey);
dengyihao's avatar
dengyihao 已提交
824
#endif
H
Hongze Cheng 已提交
825 826
  tDecoderClear(&dc);
  tdbFree(pData);
H
Hongze Cheng 已提交
827 828 829
  return 0;
}

H
Hongze Cheng 已提交
830
static int metaSaveToSkmDb(SMeta *pMeta, const SMetaEntry *pME) {
H
Hongze Cheng 已提交
831
  SEncoder              coder = {0};
H
Hongze Cheng 已提交
832
  void                 *pVal = NULL;
H
Hongze Cheng 已提交
833 834 835 836 837 838
  int                   vLen = 0;
  int                   rcode = 0;
  SSkmDbKey             skmDbKey = {0};
  const SSchemaWrapper *pSW;

  if (pME->type == TSDB_SUPER_TABLE) {
839
    pSW = &pME->stbEntry.schemaRow;
H
Hongze Cheng 已提交
840
  } else if (pME->type == TSDB_NORMAL_TABLE) {
841
    pSW = &pME->ntbEntry.schemaRow;
H
Hongze Cheng 已提交
842 843
  } else {
    ASSERT(0);
H
Hongze Cheng 已提交
844 845
  }

H
Hongze Cheng 已提交
846
  skmDbKey.uid = pME->uid;
847
  skmDbKey.sver = pSW->version;
H
Hongze Cheng 已提交
848 849

  // encode schema
wafwerar's avatar
wafwerar 已提交
850 851 852
  int32_t ret = 0;
  tEncodeSize(tEncodeSSchemaWrapper, pSW, vLen, ret);
  if (ret < 0) return -1;
H
Hongze Cheng 已提交
853
  pVal = taosMemoryMalloc(vLen);
H
Hongze Cheng 已提交
854 855 856 857 858 859
  if (pVal == NULL) {
    rcode = -1;
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    goto _exit;
  }

H
Hongze Cheng 已提交
860
  tEncoderInit(&coder, pVal, vLen);
H
Hongze Cheng 已提交
861 862
  tEncodeSSchemaWrapper(&coder, pSW);

H
Hongze Cheng 已提交
863
  if (tdbTbInsert(pMeta->pSkmDb, &skmDbKey, sizeof(skmDbKey), pVal, vLen, &pMeta->txn) < 0) {
H
Hongze Cheng 已提交
864 865 866 867 868
    rcode = -1;
    goto _exit;
  }

_exit:
H
Hongze Cheng 已提交
869
  taosMemoryFree(pVal);
H
Hongze Cheng 已提交
870
  tEncoderClear(&coder);
H
Hongze Cheng 已提交
871 872 873 874
  return rcode;
}

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

H
Hongze Cheng 已提交
877
  // save to table.db
H
Hongze Cheng 已提交
878
  if (metaSaveToTbDb(pMeta, pME) < 0) goto _err;
H
Hongze Cheng 已提交
879 880

  // update uid.idx
H
Hongze Cheng 已提交
881
  if (metaUpdateUidIdx(pMeta, pME) < 0) goto _err;
H
Hongze Cheng 已提交
882 883

  // update name.idx
H
Hongze Cheng 已提交
884
  if (metaUpdateNameIdx(pMeta, pME) < 0) goto _err;
H
Hongze Cheng 已提交
885 886 887

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

    // update tag.idx
H
Hongze Cheng 已提交
891
    if (metaUpdateTagIdx(pMeta, pME) < 0) goto _err;
H
Hongze Cheng 已提交
892 893
  } else {
    // update schema.db
H
Hongze Cheng 已提交
894
    if (metaSaveToSkmDb(pMeta, pME) < 0) goto _err;
H
Hongze Cheng 已提交
895 896 897
  }

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

H
Hongze Cheng 已提交
901
  metaULock(pMeta);
H
Hongze Cheng 已提交
902
  return 0;
H
Hongze Cheng 已提交
903 904 905 906

_err:
  metaULock(pMeta);
  return -1;
907
}
dengyihao's avatar
dengyihao 已提交
908 909 910 911 912 913 914 915
// refactor later
void *metaGetIdx(SMeta *pMeta) {
#ifdef USE_INVERTED_INDEX
  return pMeta->pTagIvtIdx;
#else
  return pMeta->pTagIdx;
#endif
}