more code
This commit is contained in:
parent
1247fb614c
commit
13a4dcbc53
|
@ -22,6 +22,7 @@ int32_t metaDropTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pReq, S
|
||||||
int32_t metaAlterTableColumnName(SMeta *pMeta, int64_t version, SVAlterTbReq *pReq, STableMetaRsp *pRsp);
|
int32_t metaAlterTableColumnName(SMeta *pMeta, int64_t version, SVAlterTbReq *pReq, STableMetaRsp *pRsp);
|
||||||
int32_t metaAlterTableColumnBytes(SMeta *pMeta, int64_t version, SVAlterTbReq *pReq, STableMetaRsp *pRsp);
|
int32_t metaAlterTableColumnBytes(SMeta *pMeta, int64_t version, SVAlterTbReq *pReq, STableMetaRsp *pRsp);
|
||||||
int32_t metaUpdateTableTagValue(SMeta *pMeta, int64_t version, SVAlterTbReq *pReq);
|
int32_t metaUpdateTableTagValue(SMeta *pMeta, int64_t version, SVAlterTbReq *pReq);
|
||||||
|
int32_t metaUpdateTableMultiTagValue(SMeta *pMeta, int64_t version, SVAlterTbReq *pReq);
|
||||||
|
|
||||||
int32_t metaSaveJsonVarToIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const SSchema *pSchema);
|
int32_t metaSaveJsonVarToIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const SSchema *pSchema);
|
||||||
|
|
||||||
|
@ -2997,7 +2998,7 @@ int metaAlterTable(SMeta *pMeta, int64_t version, SVAlterTbReq *pReq, STableMeta
|
||||||
case TSDB_ALTER_TABLE_UPDATE_TAG_VAL:
|
case TSDB_ALTER_TABLE_UPDATE_TAG_VAL:
|
||||||
return metaUpdateTableTagValue(pMeta, version, pReq);
|
return metaUpdateTableTagValue(pMeta, version, pReq);
|
||||||
case TSDB_ALTER_TABLE_UPDATE_MULTI_TAG_VAL:
|
case TSDB_ALTER_TABLE_UPDATE_MULTI_TAG_VAL:
|
||||||
return metaUpdateTableMultiTagVal(pMeta, version, pReq);
|
return metaUpdateTableMultiTagValue(pMeta, version, pReq);
|
||||||
return terrno = TSDB_CODE_VND_INVALID_TABLE_ACTION;
|
return terrno = TSDB_CODE_VND_INVALID_TABLE_ACTION;
|
||||||
case TSDB_ALTER_TABLE_UPDATE_OPTIONS:
|
case TSDB_ALTER_TABLE_UPDATE_OPTIONS:
|
||||||
return metaUpdateTableOptions(pMeta, version, pReq);
|
return metaUpdateTableOptions(pMeta, version, pReq);
|
||||||
|
|
|
@ -846,7 +846,7 @@ int32_t metaAlterTableColumnName(SMeta *pMeta, int64_t version, SVAlterTbReq *pR
|
||||||
SSchema *pColumn = NULL;
|
SSchema *pColumn = NULL;
|
||||||
int32_t iColumn = 0;
|
int32_t iColumn = 0;
|
||||||
for (int32_t i = 0; i < pSchema->nCols; i++) {
|
for (int32_t i = 0; i < pSchema->nCols; i++) {
|
||||||
if (pSchema->pSchema[i].colId == pReq->colId) {
|
if (strncmp(pSchema->pSchema[i].name, pReq->colName, TSDB_COL_NAME_LEN) == 0) {
|
||||||
pColumn = &pSchema->pSchema[i];
|
pColumn = &pSchema->pSchema[i];
|
||||||
iColumn = i;
|
iColumn = i;
|
||||||
break;
|
break;
|
||||||
|
@ -931,7 +931,7 @@ int32_t metaAlterTableColumnBytes(SMeta *pMeta, int64_t version, SVAlterTbReq *p
|
||||||
int32_t iColumn = 0;
|
int32_t iColumn = 0;
|
||||||
int32_t rowSize = 0;
|
int32_t rowSize = 0;
|
||||||
for (int32_t i = 0; i < pSchema->nCols; i++) {
|
for (int32_t i = 0; i < pSchema->nCols; i++) {
|
||||||
if (pSchema->pSchema[i].colId == pReq->colId) {
|
if (strncmp(pSchema->pSchema[i].name, pReq->colName, TSDB_COL_NAME_LEN) == 0) {
|
||||||
pColumn = &pSchema->pSchema[i];
|
pColumn = &pSchema->pSchema[i];
|
||||||
iColumn = i;
|
iColumn = i;
|
||||||
}
|
}
|
||||||
|
@ -1061,7 +1061,7 @@ int32_t metaUpdateTableTagValue(SMeta *pMeta, int64_t version, SVAlterTbReq *pRe
|
||||||
TAOS_RETURN(TSDB_CODE_INTERNAL_ERROR);
|
TAOS_RETURN(TSDB_CODE_INTERNAL_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
// do change tag value
|
// search the tag to update
|
||||||
SSchemaWrapper *pTagSchema = &pSuper->stbEntry.schemaTag;
|
SSchemaWrapper *pTagSchema = &pSuper->stbEntry.schemaTag;
|
||||||
SSchema *pColumn = NULL;
|
SSchema *pColumn = NULL;
|
||||||
int32_t iColumn = 0;
|
int32_t iColumn = 0;
|
||||||
|
@ -1168,4 +1168,202 @@ int32_t metaUpdateTableTagValue(SMeta *pMeta, int64_t version, SVAlterTbReq *pRe
|
||||||
metaFetchEntryFree(&pChild);
|
metaFetchEntryFree(&pChild);
|
||||||
metaFetchEntryFree(&pSuper);
|
metaFetchEntryFree(&pSuper);
|
||||||
TAOS_RETURN(code);
|
TAOS_RETURN(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t metaCheckUpdateTableMultiTagValueReq(SMeta *pMeta, int64_t version, SVAlterTbReq *pReq) {
|
||||||
|
int32_t code = 0;
|
||||||
|
|
||||||
|
// check tag name
|
||||||
|
if (NULL == pReq->pMultiTag || taosArrayGetSize(pReq->pMultiTag) == 0) {
|
||||||
|
metaError("vgId:%d, %s failed at %s:%d since invalid tag name, version:%" PRId64, TD_VID(pMeta->pVnode), __func__,
|
||||||
|
__FILE__, __LINE__, version);
|
||||||
|
TAOS_RETURN(TSDB_CODE_INVALID_MSG);
|
||||||
|
}
|
||||||
|
|
||||||
|
// check name
|
||||||
|
void *value = NULL;
|
||||||
|
int32_t valueSize = 0;
|
||||||
|
code = tdbTbGet(pMeta->pNameIdx, pReq->tbName, strlen(pReq->tbName) + 1, &value, &valueSize);
|
||||||
|
if (code) {
|
||||||
|
metaError("vgId:%d, %s failed at %s:%d since table %s not found, version:%" PRId64, TD_VID(pMeta->pVnode), __func__,
|
||||||
|
__FILE__, __LINE__, pReq->tbName, version);
|
||||||
|
code = TSDB_CODE_TDB_TABLE_NOT_EXIST;
|
||||||
|
TAOS_RETURN(code);
|
||||||
|
}
|
||||||
|
tdbFreeClear(value);
|
||||||
|
|
||||||
|
if (taosArrayGetSize(pReq->pMultiTag) == 0) {
|
||||||
|
metaError("vgId:%d, %s failed at %s:%d since invalid tag name, version:%" PRId64, TD_VID(pMeta->pVnode), __func__,
|
||||||
|
__FILE__, __LINE__, version);
|
||||||
|
TAOS_RETURN(TSDB_CODE_INVALID_MSG);
|
||||||
|
}
|
||||||
|
|
||||||
|
TAOS_RETURN(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t metaUpdateTableMultiTagValue(SMeta *pMeta, int64_t version, SVAlterTbReq *pReq) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
code = metaCheckUpdateTableMultiTagValueReq(pMeta, version, pReq);
|
||||||
|
if (code) {
|
||||||
|
TAOS_RETURN(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
// fetch child entry
|
||||||
|
SMetaEntry *pChild = NULL;
|
||||||
|
code = metaFetchEntryByName(pMeta, pReq->tbName, &pChild);
|
||||||
|
if (code) {
|
||||||
|
metaError("vgId:%d, %s failed at %s:%d since table %s not found, version:%" PRId64, TD_VID(pMeta->pVnode), __func__,
|
||||||
|
__FILE__, __LINE__, pReq->tbName, version);
|
||||||
|
TAOS_RETURN(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pChild->type != TSDB_CHILD_TABLE) {
|
||||||
|
metaError("vgId:%d, %s failed at %s:%d since table %s is not a child table, version:%" PRId64,
|
||||||
|
TD_VID(pMeta->pVnode), __func__, __FILE__, __LINE__, pReq->tbName, version);
|
||||||
|
metaFetchEntryFree(&pChild);
|
||||||
|
TAOS_RETURN(TSDB_CODE_VND_INVALID_TABLE_ACTION);
|
||||||
|
}
|
||||||
|
|
||||||
|
// fetch super entry
|
||||||
|
SMetaEntry *pSuper = NULL;
|
||||||
|
code = metaFetchEntryByUid(pMeta, pChild->ctbEntry.suid, &pSuper);
|
||||||
|
if (code) {
|
||||||
|
metaError("vgId:%d, %s failed at %s:%d since super table uid %" PRId64 " not found, version:%" PRId64,
|
||||||
|
TD_VID(pMeta->pVnode), __func__, __FILE__, __LINE__, pChild->ctbEntry.suid, version);
|
||||||
|
metaFetchEntryFree(&pChild);
|
||||||
|
TAOS_RETURN(TSDB_CODE_INTERNAL_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
// search the tags to update
|
||||||
|
SSchemaWrapper *pTagSchema = &pSuper->stbEntry.schemaTag;
|
||||||
|
|
||||||
|
if (pTagSchema->nCols == 1 && pTagSchema->pSchema[0].type == TSDB_DATA_TYPE_JSON) {
|
||||||
|
metaError("vgId:%d, %s failed at %s:%d since table %s has no tag, version:%" PRId64, TD_VID(pMeta->pVnode),
|
||||||
|
__func__, __FILE__, __LINE__, pReq->tbName, version);
|
||||||
|
metaFetchEntryFree(&pChild);
|
||||||
|
metaFetchEntryFree(&pSuper);
|
||||||
|
TAOS_RETURN(TSDB_CODE_VND_COL_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
// do check if tag name exists
|
||||||
|
SHashObj *pTagTable =
|
||||||
|
taosHashInit(pTagSchema->nCols, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
||||||
|
if (pTagTable == NULL) {
|
||||||
|
metaError("vgId:%d, %s failed at %s:%d since %s, version:%" PRId64, TD_VID(pMeta->pVnode), __func__, __FILE__,
|
||||||
|
__LINE__, tstrerror(terrno), version);
|
||||||
|
metaFetchEntryFree(&pChild);
|
||||||
|
metaFetchEntryFree(&pSuper);
|
||||||
|
TAOS_RETURN(terrno);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < taosArrayGetSize(pReq->pMultiTag); i++) {
|
||||||
|
SMultiTagUpateVal *pTagVal = taosArrayGet(pReq->pMultiTag, i);
|
||||||
|
if (taosHashPut(pTagTable, pTagVal->tagName, strlen(pTagVal->tagName), pTagVal, sizeof(*pTagVal)) != 0) {
|
||||||
|
metaError("vgId:%d, %s failed at %s:%d since %s, version:%" PRId64, TD_VID(pMeta->pVnode), __func__, __FILE__,
|
||||||
|
__LINE__, tstrerror(terrno), version);
|
||||||
|
taosHashCleanup(pTagTable);
|
||||||
|
metaFetchEntryFree(&pChild);
|
||||||
|
metaFetchEntryFree(&pSuper);
|
||||||
|
TAOS_RETURN(terrno);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t numOfChangedTags = 0;
|
||||||
|
for (int32_t i = 0; i < pTagSchema->nCols; i++) {
|
||||||
|
taosHashGet(pTagTable, pTagSchema->pSchema[i].name, strlen(pTagSchema->pSchema[i].name)) != NULL
|
||||||
|
? numOfChangedTags++
|
||||||
|
: 0;
|
||||||
|
}
|
||||||
|
if (numOfChangedTags < taosHashGetSize(pTagTable)) {
|
||||||
|
metaError("vgId:%d, %s failed at %s:%d since tag count mismatch, version:%" PRId64, TD_VID(pMeta->pVnode), __func__,
|
||||||
|
__FILE__, __LINE__, version);
|
||||||
|
taosHashCleanup(pTagTable);
|
||||||
|
metaFetchEntryFree(&pChild);
|
||||||
|
metaFetchEntryFree(&pSuper);
|
||||||
|
TAOS_RETURN(TSDB_CODE_VND_COL_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
// do change tag value
|
||||||
|
pChild->version = version;
|
||||||
|
const STag *pOldTag = (const STag *)pChild->ctbEntry.pTags;
|
||||||
|
SArray *pTagArray = taosArrayInit(pTagSchema->nCols, sizeof(STagVal));
|
||||||
|
if (NULL == pTagArray) {
|
||||||
|
metaError("vgId:%d, %s failed at %s:%d since %s, version:%" PRId64, TD_VID(pMeta->pVnode), __func__, __FILE__,
|
||||||
|
__LINE__, tstrerror(terrno), version);
|
||||||
|
taosHashCleanup(pTagTable);
|
||||||
|
metaFetchEntryFree(&pChild);
|
||||||
|
metaFetchEntryFree(&pSuper);
|
||||||
|
TAOS_RETURN(terrno);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pTagSchema->nCols; i++) {
|
||||||
|
SSchema *pCol = &pTagSchema->pSchema[i];
|
||||||
|
STagVal value = {
|
||||||
|
.cid = pCol->colId,
|
||||||
|
};
|
||||||
|
|
||||||
|
SMultiTagUpateVal *pTagVal = taosHashGet(pTagTable, pCol->name, strlen(pCol->name));
|
||||||
|
if (pTagVal == NULL) {
|
||||||
|
if (!tTagGet(pOldTag, &value)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
value.type = pCol->type;
|
||||||
|
if (pTagVal->isNull) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IS_VAR_DATA_TYPE(pCol->type)) {
|
||||||
|
value.pData = pTagVal->pTagVal;
|
||||||
|
value.nData = pTagVal->nTagVal;
|
||||||
|
} else {
|
||||||
|
memcpy(&value.i64, pTagVal->pTagVal, pTagVal->nTagVal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (taosArrayPush(pTagArray, &value) == NULL) {
|
||||||
|
metaError("vgId:%d, %s failed at %s:%d since %s, version:%" PRId64, TD_VID(pMeta->pVnode), __func__, __FILE__,
|
||||||
|
__LINE__, tstrerror(terrno), version);
|
||||||
|
taosHashCleanup(pTagTable);
|
||||||
|
taosArrayDestroy(pTagArray);
|
||||||
|
metaFetchEntryFree(&pChild);
|
||||||
|
metaFetchEntryFree(&pSuper);
|
||||||
|
TAOS_RETURN(terrno);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
STag *pNewTag = NULL;
|
||||||
|
code = tTagNew(pTagArray, pTagSchema->version, false, &pNewTag);
|
||||||
|
if (code) {
|
||||||
|
metaError("vgId:%d, %s failed at %s:%d since %s, version:%" PRId64, TD_VID(pMeta->pVnode), __func__, __FILE__,
|
||||||
|
__LINE__, tstrerror(code), version);
|
||||||
|
taosHashCleanup(pTagTable);
|
||||||
|
taosArrayDestroy(pTagArray);
|
||||||
|
metaFetchEntryFree(&pChild);
|
||||||
|
metaFetchEntryFree(&pSuper);
|
||||||
|
TAOS_RETURN(code);
|
||||||
|
}
|
||||||
|
taosArrayDestroy(pTagArray);
|
||||||
|
taosMemoryFree(pChild->ctbEntry.pTags);
|
||||||
|
pChild->ctbEntry.pTags = (uint8_t *)pNewTag;
|
||||||
|
|
||||||
|
// do handle entry
|
||||||
|
code = metaHandleEntry2(pMeta, pChild);
|
||||||
|
if (code) {
|
||||||
|
metaError("vgId:%d, %s failed at %s:%d since %s, uid:%" PRId64 " name:%s version:%" PRId64, TD_VID(pMeta->pVnode),
|
||||||
|
__func__, __FILE__, __LINE__, tstrerror(code), pChild->uid, pReq->tbName, version);
|
||||||
|
taosHashCleanup(pTagTable);
|
||||||
|
metaFetchEntryFree(&pChild);
|
||||||
|
metaFetchEntryFree(&pSuper);
|
||||||
|
TAOS_RETURN(code);
|
||||||
|
} else {
|
||||||
|
metaInfo("vgId:%d, table %s uid %" PRId64 " is updated, version:%" PRId64, TD_VID(pMeta->pVnode), pReq->tbName,
|
||||||
|
pChild->uid, version);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosHashCleanup(pTagTable);
|
||||||
|
metaFetchEntryFree(&pChild);
|
||||||
|
metaFetchEntryFree(&pSuper);
|
||||||
|
TAOS_RETURN(code);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue