metaTable.c 26.6 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

D
dapan1121 已提交
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
static int metaUpdateMetaRsp(tb_uid_t uid, char* tbName, SSchemaWrapper *pSchema, STableMetaRsp *pMetaRsp) {
  pMetaRsp->pSchemas = taosMemoryMalloc(pSchema->nCols * sizeof(SSchema));
  if (NULL == pMetaRsp->pSchemas) {
    terrno = TSDB_CODE_VND_OUT_OF_MEMORY;
    return -1;
  }

  strcpy(pMetaRsp->tbName, tbName);
  pMetaRsp->numOfColumns = pSchema->nCols;
  pMetaRsp->tableType = TSDB_NORMAL_TABLE;
  pMetaRsp->sversion = pSchema->version;
  pMetaRsp->tuid = uid;

  memcpy(pMetaRsp->pSchemas, pSchema->pSchema, pSchema->nCols * sizeof(SSchema));

  return 0;
}

H
Hongze Cheng 已提交
46
int metaCreateSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) {
H
Hongze Cheng 已提交
47
  SMetaEntry  me = {0};
H
Hongze Cheng 已提交
48 49 50 51
  int         kLen = 0;
  int         vLen = 0;
  const void *pKey = NULL;
  const void *pVal = NULL;
dengyihao's avatar
dengyihao 已提交
52
  void *      pBuf = NULL;
H
Hongze Cheng 已提交
53
  int32_t     szBuf = 0;
dengyihao's avatar
dengyihao 已提交
54
  void *      p = NULL;
H
Hongze Cheng 已提交
55 56 57
  SMetaReader mr = {0};

  // validate req
H
Hongze Cheng 已提交
58
  metaReaderInit(&mr, pMeta, 0);
H
Hongze Cheng 已提交
59
  if (metaGetTableEntryByName(&mr, pReq->name) == 0) {
H
Hongze Cheng 已提交
60 61
// TODO: just for pass case
#if 0
H
Hongze Cheng 已提交
62 63 64
    terrno = TSDB_CODE_TDB_TABLE_ALREADY_EXIST;
    metaReaderClear(&mr);
    return -1;
H
Hongze Cheng 已提交
65 66 67 68
#else
    metaReaderClear(&mr);
    return 0;
#endif
H
Hongze Cheng 已提交
69
  }
H
Hongze Cheng 已提交
70
  metaReaderClear(&mr);
H
Hongze Cheng 已提交
71 72

  // set structs
H
Hongze Cheng 已提交
73
  me.version = version;
H
Hongze Cheng 已提交
74 75 76
  me.type = TSDB_SUPER_TABLE;
  me.uid = pReq->suid;
  me.name = pReq->name;
77
  me.stbEntry.schemaRow = pReq->schemaRow;
H
Hongze Cheng 已提交
78
  me.stbEntry.schemaTag = pReq->schemaTag;
H
Hongze Cheng 已提交
79

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

S
Shengliang Guan 已提交
82
  metaDebug("vgId:%d, super table is created, name:%s uid: %" PRId64, TD_VID(pMeta->pVnode), pReq->name, pReq->suid);
H
Hongze Cheng 已提交
83 84 85 86

  return 0;

_err:
S
Shengliang Guan 已提交
87
  metaError("vgId:%d, failed to create super table: %s uid: %" PRId64 " since %s", TD_VID(pMeta->pVnode), pReq->name,
H
Hongze Cheng 已提交
88 89 90 91 92
            pReq->suid, tstrerror(terrno));
  return -1;
}

int metaDropSTable(SMeta *pMeta, int64_t verison, SVDropStbReq *pReq) {
H
Hongze Cheng 已提交
93 94 95 96 97 98 99 100 101 102 103 104
  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 已提交
105 106
  }

H
Hongze Cheng 已提交
107
  // drop all child tables
dengyihao's avatar
dengyihao 已提交
108
  TBC *   pCtbIdxc = NULL;
H
Hongze Cheng 已提交
109
  SArray *pArray = taosArrayInit(8, sizeof(tb_uid_t));
H
Hongze Cheng 已提交
110

H
Hongze Cheng 已提交
111
  tdbTbcOpen(pMeta->pCtbIdx, &pCtbIdxc, &pMeta->txn);
H
Hongze Cheng 已提交
112 113
  rc = tdbTbcMoveTo(pCtbIdxc, &(SCtbIdxKey){.suid = pReq->suid, .uid = INT64_MIN}, sizeof(SCtbIdxKey), &c);
  if (rc < 0) {
H
Hongze Cheng 已提交
114
    tdbTbcClose(pCtbIdxc);
H
Hongze Cheng 已提交
115 116
    metaWLock(pMeta);
    goto _drop_super_table;
H
Hongze Cheng 已提交
117 118 119
  }

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

H
Hongze Cheng 已提交
123 124 125 126 127
    if (((SCtbIdxKey *)pKey)->suid < pReq->suid) {
      continue;
    } else if (((SCtbIdxKey *)pKey)->suid > pReq->suid) {
      break;
    }
H
Hongze Cheng 已提交
128

H
Hongze Cheng 已提交
129 130 131 132 133 134
    taosArrayPush(pArray, &(((SCtbIdxKey *)pKey)->uid));
  }

  tdbTbcClose(pCtbIdxc);

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

H
Hongze Cheng 已提交
136 137
  for (int32_t iChild = 0; iChild < taosArrayGetSize(pArray); iChild++) {
    tb_uid_t uid = *(tb_uid_t *)taosArrayGet(pArray, iChild);
H
Hongze Cheng 已提交
138
    metaDropTableByUid(pMeta, uid, NULL);
H
Hongze Cheng 已提交
139 140
  }

H
Hongze Cheng 已提交
141 142 143 144 145 146 147 148 149 150 151 152
  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 已提交
153
_exit:
H
Hongze Cheng 已提交
154 155
  tdbFree(pKey);
  tdbFree(pData);
S
Shengliang Guan 已提交
156
  metaDebug("vgId:%d,  super table %s uid:%" PRId64 " is dropped", TD_VID(pMeta->pVnode), pReq->name, pReq->suid);
H
Hongze Cheng 已提交
157 158 159
  return 0;
}

H
Hongze Cheng 已提交
160 161 162
int metaAlterSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) {
  SMetaEntry  oStbEntry = {0};
  SMetaEntry  nStbEntry = {0};
dengyihao's avatar
dengyihao 已提交
163 164
  TBC *       pUidIdxc = NULL;
  TBC *       pTbDbc = NULL;
H
Hongze Cheng 已提交
165 166 167 168 169 170 171
  const void *pData;
  int         nData;
  int64_t     oversion;
  SDecoder    dc = {0};
  int32_t     ret;
  int32_t     c;

H
Hongze Cheng 已提交
172 173
  tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, &pMeta->txn);
  ret = tdbTbcMoveTo(pUidIdxc, &pReq->suid, sizeof(tb_uid_t), &c);
H
Hongze Cheng 已提交
174 175 176 177 178
  if (ret < 0 || c) {
    ASSERT(0);
    return -1;
  }

H
Hongze Cheng 已提交
179
  ret = tdbTbcGet(pUidIdxc, NULL, NULL, &pData, &nData);
H
Hongze Cheng 已提交
180 181 182 183 184 185 186
  if (ret < 0) {
    ASSERT(0);
    return -1;
  }

  oversion = *(int64_t *)pData;

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

H
Hongze Cheng 已提交
191
  ret = tdbTbcGet(pTbDbc, NULL, NULL, &pData, &nData);
H
Hongze Cheng 已提交
192 193
  ASSERT(ret == 0);

H
Hongze Cheng 已提交
194 195 196
  oStbEntry.pBuf = taosMemoryMalloc(nData);
  memcpy(oStbEntry.pBuf, pData, nData);
  tDecoderInit(&dc, oStbEntry.pBuf, nData);
H
Hongze Cheng 已提交
197 198 199 200 201 202
  metaDecodeEntry(&dc, &oStbEntry);

  nStbEntry.version = version;
  nStbEntry.type = TSDB_SUPER_TABLE;
  nStbEntry.uid = pReq->suid;
  nStbEntry.name = pReq->name;
203
  nStbEntry.stbEntry.schemaRow = pReq->schemaRow;
H
Hongze Cheng 已提交
204 205 206 207
  nStbEntry.stbEntry.schemaTag = pReq->schemaTag;

  metaWLock(pMeta);
  // compare two entry
208 209
  if (oStbEntry.stbEntry.schemaRow.version != pReq->schemaRow.version) {
    metaSaveToSkmDb(pMeta, &nStbEntry);
H
Hongze Cheng 已提交
210 211 212 213 214 215 216 217 218 219
  }

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

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

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

H
Hongze Cheng 已提交
222
  if (oStbEntry.pBuf) taosMemoryFree(oStbEntry.pBuf);
H
Hongze Cheng 已提交
223 224
  metaULock(pMeta);
  tDecoderClear(&dc);
H
Hongze Cheng 已提交
225 226
  tdbTbcClose(pTbDbc);
  tdbTbcClose(pUidIdxc);
H
Hongze Cheng 已提交
227 228 229
  return 0;
}

H
Hongze Cheng 已提交
230
int metaCreateTable(SMeta *pMeta, int64_t version, SVCreateTbReq *pReq) {
H
Hongze Cheng 已提交
231 232
  SMetaEntry  me = {0};
  SMetaReader mr = {0};
H
Hongze Cheng 已提交
233 234 235 236 237

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

H
Hongze Cheng 已提交
240
  // validate req
H
Hongze Cheng 已提交
241
  metaReaderInit(&mr, pMeta, 0);
H
Hongze Cheng 已提交
242
  if (metaGetTableEntryByName(&mr, pReq->name) == 0) {
H
Hongze Cheng 已提交
243 244 245 246
    pReq->uid = mr.me.uid;
    if (pReq->type == TSDB_CHILD_TABLE) {
      pReq->ctb.suid = mr.me.ctbEntry.suid;
    }
H
Hongze Cheng 已提交
247 248 249
    terrno = TSDB_CODE_TDB_TABLE_ALREADY_EXIST;
    metaReaderClear(&mr);
    return -1;
H
Hongze Cheng 已提交
250
  }
H
Hongze Cheng 已提交
251
  metaReaderClear(&mr);
H
Hongze Cheng 已提交
252 253

  // build SMetaEntry
H
Hongze Cheng 已提交
254
  me.version = version;
H
Hongze Cheng 已提交
255 256 257 258 259 260 261 262 263 264 265
  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;
266 267
    me.ntbEntry.schemaRow = pReq->ntb.schemaRow;
    me.ntbEntry.ncid = me.ntbEntry.schemaRow.pSchema[me.ntbEntry.schemaRow.nCols - 1].colId + 1;
H
more  
Hongze Cheng 已提交
268 269
  }

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

S
Shengliang Guan 已提交
272
  metaDebug("vgId:%d, table %s uid %" PRId64 " is created, type:%" PRId8, TD_VID(pMeta->pVnode), pReq->name, pReq->uid,
H
Hongze Cheng 已提交
273
            pReq->type);
H
refact  
Hongze Cheng 已提交
274
  return 0;
H
Hongze Cheng 已提交
275 276

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

282
int metaDropTable(SMeta *pMeta, int64_t version, SVDropTbReq *pReq, SArray *tbUids) {
dengyihao's avatar
dengyihao 已提交
283
  void *   pData = NULL;
H
Hongze Cheng 已提交
284 285 286 287
  int      nData = 0;
  int      rc = 0;
  tb_uid_t uid;
  int      type;
H
more  
Hongze Cheng 已提交
288

H
Hongze Cheng 已提交
289 290 291
  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 已提交
292 293
    return -1;
  }
H
Hongze Cheng 已提交
294 295
  uid = *(tb_uid_t *)pData;

H
Hongze Cheng 已提交
296 297 298
  metaWLock(pMeta);
  metaDropTableByUid(pMeta, uid, &type);
  metaULock(pMeta);
H
Hongze Cheng 已提交
299

H
Hongze Cheng 已提交
300 301
  if (type == TSDB_CHILD_TABLE && tbUids) {
    taosArrayPush(tbUids, &uid);
H
Hongze Cheng 已提交
302
  }
H
Hongze Cheng 已提交
303

H
Hongze Cheng 已提交
304 305 306
  tdbFree(pData);
  return 0;
}
H
Hongze Cheng 已提交
307

H
Hongze Cheng 已提交
308
static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) {
dengyihao's avatar
dengyihao 已提交
309
  void *     pData = NULL;
H
Hongze Cheng 已提交
310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335
  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 已提交
336 337
  }

H
Hongze Cheng 已提交
338 339
  tDecoderClear(&dc);
  tdbFree(pData);
H
Hongze Cheng 已提交
340

H
refact  
Hongze Cheng 已提交
341 342
  return 0;
}
H
Hongze Cheng 已提交
343

344

D
dapan1121 已提交
345
static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterTbReq, STableMetaRsp *pMetaRsp) {
dengyihao's avatar
dengyihao 已提交
346
  void *          pVal = NULL;
H
Hongze Cheng 已提交
347
  int             nVal = 0;
dengyihao's avatar
dengyihao 已提交
348
  const void *    pData = NULL;
H
Hongze Cheng 已提交
349 350 351 352
  int             nData = 0;
  int             ret = 0;
  tb_uid_t        uid;
  int64_t         oversion;
dengyihao's avatar
dengyihao 已提交
353
  SSchema *       pColumn = NULL;
H
Hongze Cheng 已提交
354 355 356 357 358
  SMetaEntry      entry = {0};
  SSchemaWrapper *pSchema;
  int             c;

  // search name index
H
Hongze Cheng 已提交
359
  ret = tdbTbGet(pMeta->pNameIdx, pAlterTbReq->tbName, strlen(pAlterTbReq->tbName) + 1, &pVal, &nVal);
H
Hongze Cheng 已提交
360 361 362 363 364 365 366 367 368 369
  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 已提交
370
  TBC *pUidIdxc = NULL;
H
Hongze Cheng 已提交
371

H
Hongze Cheng 已提交
372 373
  tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, &pMeta->txn);
  tdbTbcMoveTo(pUidIdxc, &uid, sizeof(uid), &c);
H
Hongze Cheng 已提交
374 375
  ASSERT(c == 0);

H
Hongze Cheng 已提交
376
  tdbTbcGet(pUidIdxc, NULL, NULL, &pData, &nData);
H
Hongze Cheng 已提交
377 378 379
  oversion = *(int64_t *)pData;

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

H
Hongze Cheng 已提交
382 383
  tdbTbcOpen(pMeta->pTbDb, &pTbDbc, &pMeta->txn);
  tdbTbcMoveTo(pTbDbc, &((STbDbKey){.uid = uid, .version = oversion}), sizeof(STbDbKey), &c);
H
Hongze Cheng 已提交
384
  ASSERT(c == 0);
H
Hongze Cheng 已提交
385
  tdbTbcGet(pTbDbc, NULL, NULL, &pData, &nData);
H
Hongze Cheng 已提交
386 387 388

  // get table entry
  SDecoder dc = {0};
H
Hongze Cheng 已提交
389 390 391
  entry.pBuf = taosMemoryMalloc(nData);
  memcpy(entry.pBuf, pData, nData);
  tDecoderInit(&dc, entry.pBuf, nData);
H
Hongze Cheng 已提交
392 393
  ret = metaDecodeEntry(&dc, &entry);
  ASSERT(ret == 0);
H
Hongze Cheng 已提交
394 395 396 397 398 399 400

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

  // search the column to add/drop/update
401
  pSchema = &entry.ntbEntry.schemaRow;
H
Hongze Cheng 已提交
402 403 404 405 406 407 408 409 410 411 412 413
  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 已提交
414 415
  int      tlen;
  SSchema *pNewSchema = NULL;
H
Hongze Cheng 已提交
416 417 418 419 420 421
  switch (pAlterTbReq->action) {
    case TSDB_ALTER_TABLE_ADD_COLUMN:
      if (pColumn) {
        terrno = TSDB_CODE_VND_COL_ALREADY_EXISTS;
        goto _err;
      }
422
      pSchema->version++;
H
Hongze Cheng 已提交
423
      pSchema->nCols++;
H
Hongze Cheng 已提交
424 425 426
      pNewSchema = taosMemoryMalloc(sizeof(SSchema) * pSchema->nCols);
      memcpy(pNewSchema, pSchema->pSchema, sizeof(SSchema) * (pSchema->nCols - 1));
      pSchema->pSchema = pNewSchema;
427 428 429 430 431
      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 已提交
432 433 434 435 436 437 438 439 440 441
      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;
      }
442
      pSchema->version++;
H
Hongze Cheng 已提交
443 444 445 446
      tlen = (pSchema->nCols - iCol - 1) * sizeof(SSchema);
      if (tlen) {
        memmove(pColumn, pColumn + 1, tlen);
      }
H
Hongze Cheng 已提交
447
      pSchema->nCols--;
H
Hongze Cheng 已提交
448 449 450 451 452 453
      break;
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES:
      if (pColumn == NULL) {
        terrno = TSDB_CODE_VND_TABLE_COL_NOT_EXISTS;
        goto _err;
      }
H
Hongze Cheng 已提交
454
      if (!IS_VAR_DATA_TYPE(pColumn->type) || pColumn->bytes > pAlterTbReq->colModBytes) {
H
Hongze Cheng 已提交
455 456 457
        terrno = TSDB_CODE_VND_INVALID_TABLE_ACTION;
        goto _err;
      }
458
      pSchema->version++;
H
Hongze Cheng 已提交
459
      pColumn->bytes = pAlterTbReq->colModBytes;
H
Hongze Cheng 已提交
460 461 462 463 464 465
      break;
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME:
      if (pColumn == NULL) {
        terrno = TSDB_CODE_VND_TABLE_COL_NOT_EXISTS;
        goto _err;
      }
466
      pSchema->version++;
H
Hongze Cheng 已提交
467 468 469 470 471 472
      strcpy(pColumn->name, pAlterTbReq->colNewName);
      break;
  }

  entry.version = version;

H
Hongze Cheng 已提交
473 474 475 476 477 478
  // do actual write
  metaWLock(pMeta);

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

H
Hongze Cheng 已提交
479
  tdbTbcUpsert(pUidIdxc, &entry.uid, sizeof(tb_uid_t), &version, sizeof(version), 0);
H
Hongze Cheng 已提交
480 481 482 483 484

  metaSaveToSkmDb(pMeta, &entry);

  metaULock(pMeta);

D
dapan1121 已提交
485 486
  metaUpdateMetaRsp(uid, pAlterTbReq->tbName, pSchema, pMetaRsp);

H
Hongze Cheng 已提交
487
  if (pNewSchema) taosMemoryFree(pNewSchema);
H
Hongze Cheng 已提交
488
  tDecoderClear(&dc);
H
Hongze Cheng 已提交
489 490
  tdbTbcClose(pTbDbc);
  tdbTbcClose(pUidIdxc);
H
Hongze Cheng 已提交
491
  return 0;
H
Hongze Cheng 已提交
492 493 494

_err:
  tDecoderClear(&dc);
H
Hongze Cheng 已提交
495 496
  tdbTbcClose(pTbDbc);
  tdbTbcClose(pUidIdxc);
H
Hongze Cheng 已提交
497
  return -1;
H
Hongze Cheng 已提交
498 499 500
}

static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterTbReq) {
H
Hongze Cheng 已提交
501 502
  SMetaEntry  ctbEntry = {0};
  SMetaEntry  stbEntry = {0};
dengyihao's avatar
dengyihao 已提交
503
  void *      pVal = NULL;
H
Hongze Cheng 已提交
504 505 506 507 508 509 510 511 512
  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 已提交
513
  ret = tdbTbGet(pMeta->pNameIdx, pAlterTbReq->tbName, strlen(pAlterTbReq->tbName) + 1, &pVal, &nVal);
H
Hongze Cheng 已提交
514 515 516 517 518 519 520 521 522 523
  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 已提交
524
  TBC *pUidIdxc = NULL;
H
Hongze Cheng 已提交
525

H
Hongze Cheng 已提交
526 527
  tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, &pMeta->txn);
  tdbTbcMoveTo(pUidIdxc, &uid, sizeof(uid), &c);
H
Hongze Cheng 已提交
528 529
  ASSERT(c == 0);

H
Hongze Cheng 已提交
530
  tdbTbcGet(pUidIdxc, NULL, NULL, &pData, &nData);
H
Hongze Cheng 已提交
531 532 533
  oversion = *(int64_t *)pData;

  // search table.db
dengyihao's avatar
dengyihao 已提交
534
  TBC *    pTbDbc = NULL;
H
Hongze Cheng 已提交
535 536
  SDecoder dc1 = {0};
  SDecoder dc2 = {0};
H
Hongze Cheng 已提交
537

H
Hongze Cheng 已提交
538
  /* get ctbEntry */
H
Hongze Cheng 已提交
539 540
  tdbTbcOpen(pMeta->pTbDb, &pTbDbc, &pMeta->txn);
  tdbTbcMoveTo(pTbDbc, &((STbDbKey){.uid = uid, .version = oversion}), sizeof(STbDbKey), &c);
H
Hongze Cheng 已提交
541
  ASSERT(c == 0);
H
Hongze Cheng 已提交
542
  tdbTbcGet(pTbDbc, NULL, NULL, &pData, &nData);
H
Hongze Cheng 已提交
543

H
Hongze Cheng 已提交
544 545
  ctbEntry.pBuf = taosMemoryMalloc(nData);
  memcpy(ctbEntry.pBuf, pData, nData);
H
Hongze Cheng 已提交
546 547
  tDecoderInit(&dc1, ctbEntry.pBuf, nData);
  metaDecodeEntry(&dc1, &ctbEntry);
H
Hongze Cheng 已提交
548

H
Hongze Cheng 已提交
549
  /* get stbEntry*/
H
Hongze Cheng 已提交
550 551 552
  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 已提交
553
  tdbFree(pVal);
H
Hongze Cheng 已提交
554 555
  tDecoderInit(&dc2, stbEntry.pBuf, nVal);
  metaDecodeEntry(&dc2, &stbEntry);
H
Hongze Cheng 已提交
556 557

  SSchemaWrapper *pTagSchema = &stbEntry.stbEntry.schemaTag;
dengyihao's avatar
dengyihao 已提交
558
  SSchema *       pColumn = NULL;
H
Hongze Cheng 已提交
559 560 561 562 563 564 565 566 567 568 569 570 571 572 573
  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 已提交
574

H
Hongze Cheng 已提交
575 576
  if (iCol == 0) {
    // TODO : need to update tag index
H
Hongze Cheng 已提交
577
  }
H
Hongze Cheng 已提交
578
  ctbEntry.version = version;
H
Hongze Cheng 已提交
579
  if (pTagSchema->nCols == 1 && pTagSchema->pSchema[0].type == TSDB_DATA_TYPE_JSON) {
wmmhello's avatar
wmmhello 已提交
580
    ctbEntry.ctbEntry.pTags = taosMemoryMalloc(pAlterTbReq->nTagVal);
H
Hongze Cheng 已提交
581
    if (ctbEntry.ctbEntry.pTags == NULL) {
wmmhello's avatar
wmmhello 已提交
582 583 584
      terrno = TSDB_CODE_OUT_OF_MEMORY;
      goto _err;
    }
H
Hongze Cheng 已提交
585 586
    memcpy((void *)ctbEntry.ctbEntry.pTags, pAlterTbReq->pTagVal, pAlterTbReq->nTagVal);
  } else {
C
Cary Xu 已提交
587
    const STag *pOldTag = (const STag *)ctbEntry.ctbEntry.pTags;
dengyihao's avatar
dengyihao 已提交
588 589
    STag *      pNewTag = NULL;
    SArray *    pTagArray = taosArrayInit(pTagSchema->nCols, sizeof(STagVal));
C
Cary Xu 已提交
590
    if (!pTagArray) {
C
Cary Xu 已提交
591 592 593
      terrno = TSDB_CODE_OUT_OF_MEMORY;
      goto _err;
    }
wmmhello's avatar
wmmhello 已提交
594 595 596
    for (int32_t i = 0; i < pTagSchema->nCols; i++) {
      SSchema *pCol = &pTagSchema->pSchema[i];
      if (iCol == i) {
wmmhello's avatar
wmmhello 已提交
597 598 599 600 601 602
        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;
603
        } else {
wmmhello's avatar
wmmhello 已提交
604 605 606
          memcpy(&val.i64, pAlterTbReq->pTagVal, pAlterTbReq->nTagVal);
        }
        taosArrayPush(pTagArray, &val);
wmmhello's avatar
wmmhello 已提交
607
      } else {
wmmhello's avatar
wmmhello 已提交
608
        STagVal val = {.cid = pCol->colId};
wmmhello's avatar
wmmhello 已提交
609 610
        if (tTagGet(pOldTag, &val)) {
          taosArrayPush(pTagArray, &val);
H
Hongze Cheng 已提交
611 612 613
        }
      }
    }
C
Cary Xu 已提交
614 615
    if ((terrno = tTagNew(pTagArray, pTagSchema->version, false, &pNewTag)) < 0) {
      taosArrayDestroy(pTagArray);
C
Cary Xu 已提交
616 617 618
      goto _err;
    }
    ctbEntry.ctbEntry.pTags = (uint8_t *)pNewTag;
C
Cary Xu 已提交
619
    taosArrayDestroy(pTagArray);
wmmhello's avatar
wmmhello 已提交
620
  }
H
Hongze Cheng 已提交
621 622 623 624 625

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

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

H
Hongze Cheng 已提交
628 629
  tDecoderClear(&dc1);
  tDecoderClear(&dc2);
H
Hongze Cheng 已提交
630
  if (ctbEntry.ctbEntry.pTags) taosMemoryFree((void *)ctbEntry.ctbEntry.pTags);
H
Hongze Cheng 已提交
631 632
  if (ctbEntry.pBuf) taosMemoryFree(ctbEntry.pBuf);
  if (stbEntry.pBuf) tdbFree(stbEntry.pBuf);
H
Hongze Cheng 已提交
633 634
  tdbTbcClose(pTbDbc);
  tdbTbcClose(pUidIdxc);
H
Hongze Cheng 已提交
635
  return 0;
H
Hongze Cheng 已提交
636 637

_err:
H
Hongze Cheng 已提交
638 639
  tDecoderClear(&dc1);
  tDecoderClear(&dc2);
H
Hongze Cheng 已提交
640 641
  if (ctbEntry.pBuf) taosMemoryFree(ctbEntry.pBuf);
  if (stbEntry.pBuf) tdbFree(stbEntry.pBuf);
H
Hongze Cheng 已提交
642 643
  tdbTbcClose(pTbDbc);
  tdbTbcClose(pUidIdxc);
H
Hongze Cheng 已提交
644
  return -1;
H
Hongze Cheng 已提交
645 646 647 648 649 650 651 652
}

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

D
dapan1121 已提交
653
int metaAlterTable(SMeta *pMeta, int64_t version, SVAlterTbReq *pReq, STableMetaRsp *pMetaRsp) {
H
Hongze Cheng 已提交
654 655 656 657 658
  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:
D
dapan1121 已提交
659
      return metaAlterTableColumn(pMeta, version, pReq, pMetaRsp);
H
Hongze Cheng 已提交
660 661 662 663 664 665 666 667 668 669 670
    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 已提交
671
static int metaSaveToTbDb(SMeta *pMeta, const SMetaEntry *pME) {
H
Hongze Cheng 已提交
672
  STbDbKey tbDbKey;
dengyihao's avatar
dengyihao 已提交
673 674
  void *   pKey = NULL;
  void *   pVal = NULL;
H
Hongze Cheng 已提交
675 676
  int      kLen = 0;
  int      vLen = 0;
H
Hongze Cheng 已提交
677
  SEncoder coder = {0};
H
Hongze Cheng 已提交
678 679

  // set key and value
H
Hongze Cheng 已提交
680
  tbDbKey.version = pME->version;
H
Hongze Cheng 已提交
681 682 683 684
  tbDbKey.uid = pME->uid;

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

wafwerar's avatar
wafwerar 已提交
686 687 688
  int32_t ret = 0;
  tEncodeSize(metaEncodeEntry, pME, vLen, ret);
  if (ret < 0) {
H
Hongze Cheng 已提交
689 690 691 692 693 694 695 696 697
    goto _err;
  }

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

H
Hongze Cheng 已提交
698
  tEncoderInit(&coder, pVal, vLen);
H
Hongze Cheng 已提交
699 700 701 702 703

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

H
Hongze Cheng 已提交
704
  tEncoderClear(&coder);
H
Hongze Cheng 已提交
705 706

  // write to table.db
H
Hongze Cheng 已提交
707
  if (tdbTbInsert(pMeta->pTbDb, pKey, kLen, pVal, vLen, &pMeta->txn) < 0) {
H
Hongze Cheng 已提交
708 709 710 711 712 713 714 715 716 717 718
    goto _err;
  }

  taosMemoryFree(pVal);
  return 0;

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

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

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

H
Hongze Cheng 已提交
727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746
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 已提交
747
  return tdbTbInsert(pMeta->pTtlIdx, &ttlKey, sizeof(ttlKey), NULL, 0, &pMeta->txn);
H
Hongze Cheng 已提交
748 749
}

H
Hongze Cheng 已提交
750 751
static int metaUpdateCtbIdx(SMeta *pMeta, const SMetaEntry *pME) {
  SCtbIdxKey ctbIdxKey = {.suid = pME->ctbEntry.suid, .uid = pME->uid};
H
Hongze Cheng 已提交
752
  return tdbTbInsert(pMeta->pCtbIdx, &ctbIdxKey, sizeof(ctbIdxKey), NULL, 0, &pMeta->txn);
H
Hongze Cheng 已提交
753 754
}

wmmhello's avatar
wmmhello 已提交
755
int metaCreateTagIdxKey(tb_uid_t suid, int32_t cid, const void *pTagData, int32_t nTagData, int8_t type, tb_uid_t uid,
756
                        STagIdxKey **ppTagIdxKey, int32_t *nTagIdxKey) {
dengyihao's avatar
dengyihao 已提交
757 758 759 760 761
  if (IS_VAR_DATA_TYPE(type)) {
    *nTagIdxKey = sizeof(STagIdxKey) + nTagData + VARSTR_HEADER_SIZE + sizeof(tb_uid_t);
  } else {
    *nTagIdxKey = sizeof(STagIdxKey) + nTagData + sizeof(tb_uid_t);
  }
H
Hongze Cheng 已提交
762 763 764 765 766 767 768 769 770 771 772

  *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;
dengyihao's avatar
dengyihao 已提交
773 774 775 776 777 778 779 780 781 782

  // refactor
  if (IS_VAR_DATA_TYPE(type)) {
    memcpy((*ppTagIdxKey)->data, (uint16_t *)&nTagData, VARSTR_HEADER_SIZE);
    memcpy((*ppTagIdxKey)->data + VARSTR_HEADER_SIZE, pTagData, nTagData);
    *(tb_uid_t *)((*ppTagIdxKey)->data + VARSTR_HEADER_SIZE + nTagData) = uid;
  } else {
    memcpy((*ppTagIdxKey)->data, pTagData, nTagData);
    *(tb_uid_t *)((*ppTagIdxKey)->data + nTagData) = uid;
  }
H
Hongze Cheng 已提交
783 784 785 786 787 788 789 790 791

  return 0;
}

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

static int metaUpdateTagIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry) {
dengyihao's avatar
dengyihao 已提交
792
  void *         pData = NULL;
H
Hongze Cheng 已提交
793 794 795
  int            nData = 0;
  STbDbKey       tbDbKey = {0};
  SMetaEntry     stbEntry = {0};
dengyihao's avatar
dengyihao 已提交
796
  STagIdxKey *   pTagIdxKey = NULL;
H
Hongze Cheng 已提交
797 798
  int32_t        nTagIdxKey;
  const SSchema *pTagColumn;       // = &stbEntry.stbEntry.schema.pSchema[0];
dengyihao's avatar
dengyihao 已提交
799
  const void *   pTagData = NULL;  //
C
Cary Xu 已提交
800
  int32_t        nTagData = 0;
H
Hongze Cheng 已提交
801 802 803
  SDecoder       dc = {0};

  // get super table
H
Hongze Cheng 已提交
804
  tdbTbGet(pMeta->pUidIdx, &pCtbEntry->ctbEntry.suid, sizeof(tb_uid_t), &pData, &nData);
H
Hongze Cheng 已提交
805 806
  tbDbKey.uid = pCtbEntry->ctbEntry.suid;
  tbDbKey.version = *(int64_t *)pData;
H
Hongze Cheng 已提交
807
  tdbTbGet(pMeta->pTbDb, &tbDbKey, sizeof(tbDbKey), &pData, &nData);
H
Hongze Cheng 已提交
808 809 810 811 812

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

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

  STagVal tagVal = {.cid = pTagColumn->colId};
815
  if (pTagColumn->type != TSDB_DATA_TYPE_JSON) {
wmmhello's avatar
wmmhello 已提交
816
    tTagGet((const STag *)pCtbEntry->ctbEntry.pTags, &tagVal);
817
    if (IS_VAR_DATA_TYPE(pTagColumn->type)) {
wmmhello's avatar
wmmhello 已提交
818 819
      pTagData = tagVal.pData;
      nTagData = (int32_t)tagVal.nData;
820
    } else {
wmmhello's avatar
wmmhello 已提交
821 822 823
      pTagData = &(tagVal.i64);
      nTagData = tDataTypes[pTagColumn->type].bytes;
    }
824 825 826
  } else {
    // pTagData = pCtbEntry->ctbEntry.pTags;
    // nTagData = ((const STag *)pCtbEntry->ctbEntry.pTags)->len;
wmmhello's avatar
wmmhello 已提交
827
  }
H
Hongze Cheng 已提交
828 829

  // update tag index
dengyihao's avatar
dengyihao 已提交
830 831 832 833 834 835 836 837 838 839 840 841
#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
842 843
  if (metaCreateTagIdxKey(pCtbEntry->ctbEntry.suid, pTagColumn->colId, pTagData, nTagData, pTagColumn->type,
                          pCtbEntry->uid, &pTagIdxKey, &nTagIdxKey) < 0) {
H
Hongze Cheng 已提交
844 845
    return -1;
  }
H
Hongze Cheng 已提交
846
  tdbTbInsert(pMeta->pTagIdx, pTagIdxKey, nTagIdxKey, NULL, 0, &pMeta->txn);
H
Hongze Cheng 已提交
847
  metaDestroyTagIdxKey(pTagIdxKey);
dengyihao's avatar
dengyihao 已提交
848
#endif
H
Hongze Cheng 已提交
849 850
  tDecoderClear(&dc);
  tdbFree(pData);
H
Hongze Cheng 已提交
851 852 853
  return 0;
}

H
Hongze Cheng 已提交
854
static int metaSaveToSkmDb(SMeta *pMeta, const SMetaEntry *pME) {
H
Hongze Cheng 已提交
855
  SEncoder              coder = {0};
dengyihao's avatar
dengyihao 已提交
856
  void *                pVal = NULL;
H
Hongze Cheng 已提交
857 858 859 860 861 862
  int                   vLen = 0;
  int                   rcode = 0;
  SSkmDbKey             skmDbKey = {0};
  const SSchemaWrapper *pSW;

  if (pME->type == TSDB_SUPER_TABLE) {
863
    pSW = &pME->stbEntry.schemaRow;
H
Hongze Cheng 已提交
864
  } else if (pME->type == TSDB_NORMAL_TABLE) {
865
    pSW = &pME->ntbEntry.schemaRow;
H
Hongze Cheng 已提交
866 867
  } else {
    ASSERT(0);
H
Hongze Cheng 已提交
868 869
  }

H
Hongze Cheng 已提交
870
  skmDbKey.uid = pME->uid;
871
  skmDbKey.sver = pSW->version;
H
Hongze Cheng 已提交
872 873

  // encode schema
wafwerar's avatar
wafwerar 已提交
874 875 876
  int32_t ret = 0;
  tEncodeSize(tEncodeSSchemaWrapper, pSW, vLen, ret);
  if (ret < 0) return -1;
H
Hongze Cheng 已提交
877
  pVal = taosMemoryMalloc(vLen);
H
Hongze Cheng 已提交
878 879 880 881 882 883
  if (pVal == NULL) {
    rcode = -1;
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    goto _exit;
  }

H
Hongze Cheng 已提交
884
  tEncoderInit(&coder, pVal, vLen);
H
Hongze Cheng 已提交
885 886
  tEncodeSSchemaWrapper(&coder, pSW);

H
Hongze Cheng 已提交
887
  if (tdbTbInsert(pMeta->pSkmDb, &skmDbKey, sizeof(skmDbKey), pVal, vLen, &pMeta->txn) < 0) {
H
Hongze Cheng 已提交
888 889 890 891 892
    rcode = -1;
    goto _exit;
  }

_exit:
H
Hongze Cheng 已提交
893
  taosMemoryFree(pVal);
H
Hongze Cheng 已提交
894
  tEncoderClear(&coder);
H
Hongze Cheng 已提交
895 896 897 898
  return rcode;
}

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

H
Hongze Cheng 已提交
901
  // save to table.db
H
Hongze Cheng 已提交
902
  if (metaSaveToTbDb(pMeta, pME) < 0) goto _err;
H
Hongze Cheng 已提交
903 904

  // update uid.idx
H
Hongze Cheng 已提交
905
  if (metaUpdateUidIdx(pMeta, pME) < 0) goto _err;
H
Hongze Cheng 已提交
906 907

  // update name.idx
H
Hongze Cheng 已提交
908
  if (metaUpdateNameIdx(pMeta, pME) < 0) goto _err;
H
Hongze Cheng 已提交
909 910 911

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

    // update tag.idx
H
Hongze Cheng 已提交
915
    if (metaUpdateTagIdx(pMeta, pME) < 0) goto _err;
H
Hongze Cheng 已提交
916 917
  } else {
    // update schema.db
H
Hongze Cheng 已提交
918
    if (metaSaveToSkmDb(pMeta, pME) < 0) goto _err;
H
Hongze Cheng 已提交
919 920 921
  }

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

H
Hongze Cheng 已提交
925
  metaULock(pMeta);
H
Hongze Cheng 已提交
926
  return 0;
H
Hongze Cheng 已提交
927 928 929 930

_err:
  metaULock(pMeta);
  return -1;
931
}
dengyihao's avatar
dengyihao 已提交
932 933 934 935 936 937 938 939
// refactor later
void *metaGetIdx(SMeta *pMeta) {
#ifdef USE_INVERTED_INDEX
  return pMeta->pTagIvtIdx;
#else
  return pMeta->pTagIdx;
#endif
}