提交 de60ea41 编写于 作者: wmmhello's avatar wmmhello

TD-6129<feature> fix error if json key not the same type

上级 74551380
...@@ -120,11 +120,13 @@ int tsdbCreateTable(STsdbRepo *repo, STableCfg *pCfg) { ...@@ -120,11 +120,13 @@ int tsdbCreateTable(STsdbRepo *repo, STableCfg *pCfg) {
tsdbWLockRepoMeta(pRepo); tsdbWLockRepoMeta(pRepo);
if (newSuper) { if (newSuper) {
if (tsdbAddTableToMeta(pRepo, super, true, false) < 0) { if (tsdbAddTableToMeta(pRepo, super, true, false) < 0) {
super = NULL;
tsdbUnlockRepoMeta(pRepo); tsdbUnlockRepoMeta(pRepo);
goto _err; goto _err;
} }
} }
if (tsdbAddTableToMeta(pRepo, table, true, false) < 0) { if (tsdbAddTableToMeta(pRepo, table, true, false) < 0) {
table = NULL;
tsdbUnlockRepoMeta(pRepo); tsdbUnlockRepoMeta(pRepo);
goto _err; goto _err;
} }
...@@ -1087,60 +1089,72 @@ static int tsdbAddTableIntoIndex(STsdbMeta *pMeta, STable *pTable, bool refSuper ...@@ -1087,60 +1089,72 @@ static int tsdbAddTableIntoIndex(STsdbMeta *pMeta, STable *pTable, bool refSuper
ASSERT(pSTable->tagSchema->numOfCols == 1); ASSERT(pSTable->tagSchema->numOfCols == 1);
int16_t nCols = kvRowNCols(pTable->tagVal); int16_t nCols = kvRowNCols(pTable->tagVal);
ASSERT(nCols%2 == 1); ASSERT(nCols%2 == 1);
// check first
for (int j = 0; j < nCols; ++j) { for (int j = 0; j < nCols; ++j) {
if (j != 0 && j%2 == 0) continue; // jump value if (j != 0 && j % 2 == 0) continue; // jump value
SColIdx * pColIdx = kvRowColIdxAt(pTable->tagVal, j); SColIdx *pColIdx = kvRowColIdxAt(pTable->tagVal, j);
void* val = (kvRowColVal(pTable->tagVal, pColIdx)); void *val = (kvRowColVal(pTable->tagVal, pColIdx));
if (j == 0){ // json value is the first if (j == 0) { // json value is the first
int8_t jsonPlaceHolder = *(int8_t*)val; int8_t jsonPlaceHolder = *(int8_t *)val;
ASSERT(jsonPlaceHolder == TSDB_DATA_JSON_PLACEHOLDER); ASSERT(jsonPlaceHolder == TSDB_DATA_JSON_PLACEHOLDER);
continue; continue;
} }
if (j == 1){ if (j == 1) {
uint8_t jsonNULL = *(uint8_t*)(varDataVal(val)); uint8_t jsonNULL = *(uint8_t *)(varDataVal(val));
ASSERT(jsonNULL == TSDB_DATA_JSON_NULL); ASSERT(jsonNULL == TSDB_DATA_JSON_NULL);
} }
char keyMd5[TSDB_MAX_JSON_KEY_MD5_LEN] = {0}; char keyMd5[TSDB_MAX_JSON_KEY_MD5_LEN] = {0};
jsonKeyMd5(varDataVal(val), varDataLen(val), keyMd5); jsonKeyMd5(varDataVal(val), varDataLen(val), keyMd5);
SArray* tablistNew = NULL; SArray *tablistNew = NULL;
SArray** tablist = (SArray**)taosHashGet(pSTable->jsonKeyMap, keyMd5, TSDB_MAX_JSON_KEY_MD5_LEN); SArray **tablist = (SArray **)taosHashGet(pSTable->jsonKeyMap, keyMd5, TSDB_MAX_JSON_KEY_MD5_LEN);
if(tablist == NULL) { if (tablist == NULL) {
tablistNew = taosArrayInit(8, sizeof(JsonMapValue)); tablistNew = taosArrayInit(8, sizeof(JsonMapValue));
if(tablistNew == NULL){ if (tablistNew == NULL) {
terrno = TSDB_CODE_TDB_OUT_OF_MEMORY; terrno = TSDB_CODE_TDB_OUT_OF_MEMORY;
tsdbError("out of memory when alloc json tag array"); tsdbError("out of memory when alloc json tag array");
return -1; return -1;
} }
if(taosHashPut(pSTable->jsonKeyMap, keyMd5, TSDB_MAX_JSON_KEY_MD5_LEN, &tablistNew, sizeof(void*)) < 0){ if (taosHashPut(pSTable->jsonKeyMap, keyMd5, TSDB_MAX_JSON_KEY_MD5_LEN, &tablistNew, sizeof(void *)) < 0) {
terrno = TSDB_CODE_TDB_OUT_OF_MEMORY; terrno = TSDB_CODE_TDB_OUT_OF_MEMORY;
tsdbError("out of memory when put json tag array"); tsdbError("out of memory when put json tag array");
return -1; return -1;
} }
}else{ } else {
tablistNew = *tablist; tablistNew = *tablist;
} }
if(taosArrayGetSize(tablistNew) > 0){ if (taosArrayGetSize(tablistNew) > 0) {
// validate type // validate type
JsonMapValue* tmp = taosArrayGet(tablistNew, 0); JsonMapValue *tmp = taosArrayGet(tablistNew, 0);
void* data1 = tdGetKVRowValOfCol(((STable *)(tmp->table))->tagVal, tmp->colId + 1); void *data1 = tdGetKVRowValOfCol(((STable *)(tmp->table))->tagVal, tmp->colId + 1);
SColIdx * pInsertColIdx = kvRowColIdxAt(pTable->tagVal, j + 1); SColIdx *pInsertColIdx = kvRowColIdxAt(pTable->tagVal, j + 1);
void* data2 = (kvRowColVal(pTable->tagVal, pInsertColIdx)); void *data2 = (kvRowColVal(pTable->tagVal, pInsertColIdx));
if(*(uint8_t*)data1 != *(uint8_t*)data2){ if (*(uint8_t *)data1 != *(uint8_t *)data2) {
terrno = TSDB_CODE_TDB_IVLD_SAME_JSON_VALUE; terrno = TSDB_CODE_TDB_IVLD_SAME_JSON_VALUE;
tsdbError("invalidate same json tag value"); tsdbError("invalidate same json tag value");
return -1; return -1;
} }
} }
}
// then insert
for (int j = 0; j < nCols; ++j) {
if (j != 0 && j % 2 == 0) continue; // jump value
SColIdx *pColIdx = kvRowColIdxAt(pTable->tagVal, j);
void *val = (kvRowColVal(pTable->tagVal, pColIdx));
char keyMd5[TSDB_MAX_JSON_KEY_MD5_LEN] = {0};
jsonKeyMd5(varDataVal(val), varDataLen(val), keyMd5);
SArray **tablist = (SArray **)taosHashGet(pSTable->jsonKeyMap, keyMd5, TSDB_MAX_JSON_KEY_MD5_LEN);
JsonMapValue jmvalue = {pTable, pColIdx->colId}; JsonMapValue jmvalue = {pTable, pColIdx->colId};
void* p = taosArraySearch(tablistNew, &jmvalue, tsdbCompareJsonMapValue, TD_EQ); void* p = taosArraySearch(*tablist, &jmvalue, tsdbCompareJsonMapValue, TD_EQ);
if (p == NULL) { if (p == NULL) {
p = taosArraySearch(tablistNew, &jmvalue, tsdbCompareJsonMapValue, TD_GE); p = taosArraySearch(*tablist, &jmvalue, tsdbCompareJsonMapValue, TD_GE);
if(p == NULL){ if(p == NULL){
taosArrayPush(tablistNew, &jmvalue); taosArrayPush(*tablist, &jmvalue);
}else{ }else{
taosArrayInsert(tablistNew, TARRAY_ELEM_IDX(tablistNew, p), &jmvalue); taosArrayInsert(*tablist, TARRAY_ELEM_IDX(*tablist, p), &jmvalue);
} }
}else{ }else{
tsdbError("insert dumplicate"); tsdbError("insert dumplicate");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册