diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index c7a24ab4e9abed681519f72872b55371f364314e..2e6cee31bf39bc26da9773433282729eb9811557 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -2657,7 +2657,8 @@ static void updateFieldForJson(SSqlObj *pSql, SQueryTableRsp *pQueryAttr){ if (pField->field.type == TSDB_DATA_TYPE_JSON) { pField->fieldJson.type = TSDB_DATA_TYPE_JSON; for (int k = 0; k < pQueryAttr->tJsonSchLen; ++k) { - if (strncmp(pField->fieldJson.name, pQueryAttr->tagJsonSchema[k].name, TSDB_MAX_JSON_KEY_LEN) == 0) { + if (strncmp(pField->fieldJson.name, pQueryAttr->tagJsonSchema[k].name, TSDB_MAX_JSON_KEY_LEN) == 0 + && pQueryAttr->tagJsonSchema[k].type != TSDB_DATA_TYPE_JSON) { pField->fieldJson.type = pQueryAttr->tagJsonSchema[k].type; pField->fieldJson.bytes = TYPE_BYTES[pField->field.type]; tscDebug("0x%" PRIx64 " change json type %s:%s to %d", pSql->self, pField->field.name, pQueryAttr->tagJsonSchema[k].name, diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c index 35c2c913d9b29a054b97eae8d3d7eb9bc1c8decc..1f5f35c4e3b12a5c2ad006f1c9ca661e37430ccf 100644 --- a/src/client/src/tscUtil.c +++ b/src/client/src/tscUtil.c @@ -715,11 +715,12 @@ static void setResRawPtrImpl(SSqlRes* pRes, SInternalField* pInfo, int32_t i, bo char* realData = p + CHAR_BYTES; char type = *p; - if (type == TSDB_DATA_TYPE_NCHAR && isNull(realData, TSDB_DATA_TYPE_JSON)) { - memcpy(dst, realData, varDataTLen(realData)); - offset = pInfo->field.bytes; - }else if (type == TSDB_DATA_TYPE_NCHAR) { - if(convertNchar){ + if (type == TSDB_DATA_TYPE_JSON && isNull(realData, TSDB_DATA_TYPE_JSON)) { + type = pInfo->fieldJson.type; + setNull(realData, type, 0); + } + if (type == TSDB_DATA_TYPE_NCHAR || type == TSDB_DATA_TYPE_JSON) { + if(convertNchar && !isNull(realData, TSDB_DATA_TYPE_NCHAR)){ int32_t length = taosUcs4ToMbs(varDataVal(realData), varDataLen(realData), varDataVal(dst)); varDataSetLen(dst, length); if (length == 0) { @@ -729,17 +730,10 @@ static void setResRawPtrImpl(SSqlRes* pRes, SInternalField* pInfo, int32_t i, bo memcpy(dst, realData, varDataTLen(realData)); } offset = pInfo->field.bytes; - }else if (type == TSDB_DATA_TYPE_DOUBLE) { - memcpy(dst, realData, DOUBLE_BYTES); - offset = DOUBLE_BYTES; - }else if (type == TSDB_DATA_TYPE_BIGINT) { - memcpy(dst, realData, LONG_BYTES); - offset = LONG_BYTES; - }else if (type == TSDB_DATA_TYPE_BOOL) { - memcpy(dst, realData, CHAR_BYTES); - offset = CHAR_BYTES; }else { - assert(0); + assert(type <= TSDB_DATA_TYPE_DOUBLE && type >=TSDB_DATA_TYPE_BOOL); + memcpy(dst, realData, tDataTypes[(int32_t)type].bytes); + offset = tDataTypes[(int32_t)type].bytes; } p += pInfo->field.bytes; @@ -5384,7 +5378,7 @@ void* getJsonTagValueElment(STable* data, char* key, int32_t keyLen, char* dst, void* result = getJsonTagValue(data, keyMd5, TSDB_MAX_JSON_KEY_MD5_LEN, NULL); if (result == NULL){ // json key no result if(!dst) return NULL; - *(char*)dst = TSDB_DATA_TYPE_NCHAR; + *(char*)dst = TSDB_DATA_TYPE_JSON; setNull(dst + CHAR_BYTES, TSDB_DATA_TYPE_JSON, 0); return dst; } @@ -5412,7 +5406,7 @@ void* getJsonTagValueElment(STable* data, char* key, int32_t keyLen, char* dst, void getJsonTagValueAll(void* data, void* dst, int16_t bytes) { char* json = parseTagDatatoJson(data); char* tagData = dst + CHAR_BYTES; - *(char*)dst = TSDB_DATA_TYPE_NCHAR; + *(char*)dst = TSDB_DATA_TYPE_JSON; if(json == NULL){ setNull(tagData, TSDB_DATA_TYPE_JSON, 0); return; diff --git a/src/query/src/queryMain.c b/src/query/src/queryMain.c index dae0a237489ba3b0c5c642cfe0a796122bf5747a..e8d147d5398121d82c5f7860901eb78567cca087 100644 --- a/src/query/src/queryMain.c +++ b/src/query/src/queryMain.c @@ -83,12 +83,12 @@ static void* setJsonTagSchema(void* tsdb, int16_t numOfOutput, SExprInfo *pExprs SSqlExpr* sqlExpr = &pExprs[i].base; if (sqlExpr->colType == TSDB_DATA_TYPE_JSON && sqlExpr->numOfParams > 0){ TagJsonSSchema* schema = (TagJsonSSchema*)(tmp); - schema->type = TSDB_DATA_TYPE_NULL; + schema->type = TSDB_DATA_TYPE_JSON; tstrncpy(schema->name, sqlExpr->aliasName, TSDB_MAX_JSON_KEY_LEN); for (int j = 0; j < taosArrayGetSize(pTableIdList); ++j) { STableIdInfo *id = taosArrayGet(pTableIdList, j); uint8_t type = getTagJsonType(tsdb, id->uid, sqlExpr->param[0].pz, sqlExpr->param[0].nLen); - if(type != TSDB_DATA_TYPE_NULL) { + if(type != TSDB_DATA_TYPE_JSON) { schema->type = type; break; } diff --git a/src/tsdb/src/tsdbRead.c b/src/tsdb/src/tsdbRead.c index e982530f90cc206c357d1e926785e78d3ddac916..37dd692a15df02710660821145ea3d5a576dd582 100644 --- a/src/tsdb/src/tsdbRead.c +++ b/src/tsdb/src/tsdbRead.c @@ -4118,7 +4118,7 @@ uint8_t getTagJsonType(STsdbRepo* tsdb, uint64_t uid, char* key, int32_t len){ if(result){ return *(char*)result; }else{ - return TSDB_DATA_TYPE_NULL; + return TSDB_DATA_TYPE_JSON; } }