From 46edf75cedf63ae2d0e6fde97fd6b0e7f0736a84 Mon Sep 17 00:00:00 2001 From: factosea <285808407@qq.com> Date: Thu, 25 Apr 2024 09:33:01 +0800 Subject: [PATCH] fix: copy schemaExt in subtable --- source/libs/catalog/src/ctgCache.c | 13 +++++++++++++ source/libs/parser/src/parUtil.c | 6 +----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/source/libs/catalog/src/ctgCache.c b/source/libs/catalog/src/ctgCache.c index 1c775fcce7..958f78eb36 100644 --- a/source/libs/catalog/src/ctgCache.c +++ b/source/libs/catalog/src/ctgCache.c @@ -596,6 +596,7 @@ int32_t ctgCopyTbMeta(SCatalog *pCtg, SCtgTbMetaCtx *ctx, SCtgDBCache **pDb, SCt } memcpy(&(*pTableMeta)->sversion, &stbMeta->sversion, metaSize - sizeof(SCTableMeta)); + (*pTableMeta)->schemaExt = NULL; return TSDB_CODE_SUCCESS; } @@ -2883,14 +2884,25 @@ int32_t ctgGetTbMetasFromCache(SCatalog *pCtg, SRequestConnInfo *pConn, SCtgTbMe SMetaRes res = {0}; STableMeta *pTableMeta = NULL; if (tbMeta->tableType != TSDB_CHILD_TABLE) { + int32_t schemaExtSize = 0; int32_t metaSize = CTG_META_SIZE(tbMeta); pTableMeta = taosMemoryCalloc(1, metaSize); + if (tbMeta->schemaExt != NULL) { + schemaExtSize = tbMeta->tableInfo.numOfColumns * sizeof(SSchemaExt); + } + pTableMeta = taosMemoryCalloc(1, metaSize + schemaExtSize); if (NULL == pTableMeta) { ctgReleaseTbMetaToCache(pCtg, dbCache, pCache); CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); } memcpy(pTableMeta, tbMeta, metaSize); + if (tbMeta->schemaExt != NULL) { + pTableMeta->schemaExt = (SSchemaExt *)((char *)pTableMeta + metaSize); + memcpy(pTableMeta->schemaExt, tbMeta->schemaExt, schemaExtSize); + } else { + pTableMeta->schemaExt = NULL; + } CTG_UNLOCK(CTG_READ, &pCache->metaLock); taosHashRelease(dbCache->tbCache, pCache); @@ -2999,6 +3011,7 @@ int32_t ctgGetTbMetasFromCache(SCatalog *pCtg, SRequestConnInfo *pConn, SCtgTbMe } memcpy(&pTableMeta->sversion, &stbMeta->sversion, metaSize - sizeof(SCTableMeta)); + pTableMeta->schemaExt = NULL; CTG_UNLOCK(CTG_READ, &pCache->metaLock); taosHashRelease(dbCache->tbCache, pCache); diff --git a/source/libs/parser/src/parUtil.c b/source/libs/parser/src/parUtil.c index d76af7c3b4..5bd484f137 100644 --- a/source/libs/parser/src/parUtil.c +++ b/source/libs/parser/src/parUtil.c @@ -315,19 +315,15 @@ STableMeta* tableMetaDup(const STableMeta* pTableMeta) { size_t schemaExtSize = hasSchemaExt ? pTableMeta->tableInfo.numOfColumns * sizeof(SSchemaExt) : 0; size_t size = sizeof(STableMeta) + numOfFields * sizeof(SSchema); - int32_t cpSize = sizeof(STableMeta) - sizeof(void*); STableMeta* p = taosMemoryMalloc(size + schemaExtSize); - if (NULL == p) return NULL; - memcpy(p, pTableMeta, cpSize); + memcpy(p, pTableMeta, schemaExtSize+size); if (hasSchemaExt) { p->schemaExt = (SSchemaExt*)(((char*)p) + size); - memcpy(p->schemaExt, pTableMeta->schemaExt, schemaExtSize); } else { p->schemaExt = NULL; } - memcpy(p->schema, pTableMeta->schema, numOfFields * sizeof(SSchema)); return p; }