diff --git a/src/client/inc/tscUtil.h b/src/client/inc/tscUtil.h index 493fe49e3fe79225e85060a88c07315494961a92..a0598c1bbfcf9bad2bc38e7c866eef0338e4f3dd 100644 --- a/src/client/inc/tscUtil.h +++ b/src/client/inc/tscUtil.h @@ -376,12 +376,12 @@ void tscRemoveCachedTableMeta(STableMetaInfo* pTableMetaInfo, uint64_t id); char* cloneCurrentDBName(SSqlObj* pSql); -int parseJsontoTagData(char* json, SKVRowBuilder* kvRowBuilder, char* errMsg, int16_t startColId); -char* parseTagDatatoJson(void *p); -void findTagValue(STable* data, char* key, int32_t keyLen, char* out, int16_t len); +int parseJsontoTagData(char* json, SKVRowBuilder* kvRowBuilder, char* errMsg, int16_t startColId, uint8_t jsonType); +char* parseTagDatatoJson(void *p, uint8_t jsonType); +void findTagValue(STable* data, char* key, int32_t keyLen, char* out, int16_t len, uint8_t jsonType); -int8_t jsonType2DbType(double data, int jsonType); -void* getJsonTagValue(STable* pTable, char* key, int32_t keyLen); +int8_t jsonType2DbType(double data, int jsonType, uint8_t type); +void* getJsonTagValue(STable* pTable, char* key, int32_t keyLen, uint8_t jsonType); #ifdef __cplusplus } diff --git a/src/client/src/tscLocal.c b/src/client/src/tscLocal.c index 5fd4b9931b8c46f4535519a0ebdedfaddb5c3f47..ee5f63bdc41738813cce87ee103a00cf58c2421c 100644 --- a/src/client/src/tscLocal.c +++ b/src/client/src/tscLocal.c @@ -86,29 +86,14 @@ static int32_t tscSetValueToResObj(SSqlObj *pSql, int32_t rowLen) { pField = tscFieldInfoGetField(&pQueryInfo->fieldsInfo, 1); dst = pRes->data + tscFieldInfoGetOffset(pQueryInfo, 1) * totalNumOfRows + pField->bytes * i; STR_WITH_MAXSIZE_TO_VARSTR(dst, type, pField->bytes); - char *postfix = NULL; - if (pSchema[i].type == TSDB_DATA_TYPE_JSON && JSON_TYPE_BINARY){ - postfix = " BINARY"; - - } - else if(pSchema[i].type == TSDB_DATA_TYPE_JSON && JSON_TYPE_NCHAR) { - postfix = " NCHAR"; - } - if(postfix){ - strncpy(varDataVal(dst), postfix, pField->bytes-varDataTLen(dst)); - varDataSetLen(dst, varDataLen(dst) + strlen(postfix)); - } int32_t bytes = pSchema[i].bytes; - if (pSchema[i].type == TSDB_DATA_TYPE_BINARY || (pSchema[i].type == TSDB_DATA_TYPE_JSON && JSON_TYPE_BINARY)){ + if (pSchema[i].type == TSDB_DATA_TYPE_BINARY || pSchema[i].type == TSDB_DATA_TYPE_JSON_BINARY){ bytes -= VARSTR_HEADER_SIZE; } - else if(pSchema[i].type == TSDB_DATA_TYPE_NCHAR || (pSchema[i].type == TSDB_DATA_TYPE_JSON && JSON_TYPE_NCHAR)) { + else if(pSchema[i].type == TSDB_DATA_TYPE_NCHAR || pSchema[i].type == TSDB_DATA_TYPE_JSON_NCHAR) { bytes -= VARSTR_HEADER_SIZE; - - if (pSchema[i].type == TSDB_DATA_TYPE_NCHAR) { - bytes = bytes / TSDB_NCHAR_SIZE; - } + bytes = bytes / TSDB_NCHAR_SIZE; } pField = tscFieldInfoGetField(&pQueryInfo->fieldsInfo, 2); diff --git a/src/client/src/tscParseInsert.c b/src/client/src/tscParseInsert.c index 00bc928a3d3bb2f116ae161e9fd99627c1c0f96c..fba74c68aa1178309a22d40b4c00fd151b0d8237 100644 --- a/src/client/src/tscParseInsert.c +++ b/src/client/src/tscParseInsert.c @@ -387,7 +387,8 @@ int32_t tsParseOneColumn(SSchema *pSchema, SStrToken *pToken, char *payload, cha } break; - case TSDB_DATA_TYPE_JSON: + case TSDB_DATA_TYPE_JSON_BINARY: + case TSDB_DATA_TYPE_JSON_NCHAR: if (pToken->n >= pSchema->bytes) { // reserve 1 byte for select return tscInvalidOperationMsg(msg, "json tag length too long", pToken->z); } @@ -1081,7 +1082,7 @@ static int32_t tscCheckIfCreateTable(char **sqlstr, SSqlObj *pSql, char** boundC } // encode json tag string - if(spd.numOfBound == 1 && pTagSchema[spd.boundedColumns[0]].type == TSDB_DATA_TYPE_JSON){ + if(spd.numOfBound == 1 && IS_JSON_DATA_TYPE(pTagSchema[spd.boundedColumns[0]].type)){ char tmp = sToken.z[sToken.n]; sToken.z[sToken.n] = 0; // if(sToken.type != TK_STRING) { @@ -1089,7 +1090,7 @@ static int32_t tscCheckIfCreateTable(char **sqlstr, SSqlObj *pSql, char** boundC // tscDestroyBoundColumnInfo(&spd); // return tscSQLSyntaxErrMsg(pInsertParam->msg, "json type error, should be string", NULL); // } - code = parseJsontoTagData(sToken.z, &kvRowBuilder, pInsertParam->msg, pTagSchema[spd.boundedColumns[0]].colId); + code = parseJsontoTagData(sToken.z, &kvRowBuilder, pInsertParam->msg, pTagSchema[spd.boundedColumns[0]].colId, pTagSchema[spd.boundedColumns[0]].type); if (code != TSDB_CODE_SUCCESS) { tdDestroyKVRowBuilder(&kvRowBuilder); tscDestroyBoundColumnInfo(&spd); @@ -1112,7 +1113,7 @@ static int32_t tscCheckIfCreateTable(char **sqlstr, SSqlObj *pSql, char** boundC return tscSQLSyntaxErrMsg(pInsertParam->msg, "tag value expected", NULL); } // encode json tag string - if(spd.numOfBound == 1 && pTagSchema[spd.boundedColumns[0]].type == TSDB_DATA_TYPE_JSON){ + if(spd.numOfBound == 1 && IS_JSON_DATA_TYPE(pTagSchema[spd.boundedColumns[0]].type)){ if(kvRowLen(row) >= pTagSchema[spd.boundedColumns[0]].bytes){ // reserve 1 byte for select char tmp[128]= {0}; sprintf(tmp, "tag value is too small, can not contain encoded json tag:%d|%d", kvRowLen(row), pTagSchema[spd.boundedColumns[0]].bytes); diff --git a/src/client/src/tscPrepare.c b/src/client/src/tscPrepare.c index 186fc6286efba135ead881d3ee84ec5653efd52a..5123b75f2eb9f9c9fedf252b65effdfaff100eea 100644 --- a/src/client/src/tscPrepare.c +++ b/src/client/src/tscPrepare.c @@ -905,7 +905,7 @@ static int doBindBatchParam(STableDataBlocks* pBlock, SParamInfo* param, TAOS_MU } varDataSetLen(data + param->offset, output); - } else if (param->type == TSDB_DATA_TYPE_JSON) { // todo json + } else if (IS_JSON_DATA_TYPE(param->type)) { // todo json } } diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index e29546ed61effccdfc9744cf134c3392139a1792..74869eb889f96d3aafefcf01077797521cad7a42 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -162,7 +162,7 @@ bool serializeExprListToVariant(SArray* pList, tVariant **dst, int16_t colType, tSqlExpr* item = ((tSqlExprItem*)(taosArrayGet(pList, 0)))->pNode; int32_t firstVarType = item->value.nType; - if(colType == TSDB_DATA_TYPE_JSON) colType = firstVarType; + if(IS_JSON_DATA_TYPE(colType)) colType = firstVarType; SBufferWriter bw = tbufInitWriter( NULL, false); tbufEnsureCapacity(&bw, 512); @@ -1440,7 +1440,7 @@ static bool validateTableColumnInfo(SArray* pFieldList, SSqlCmd* pCmd) { int32_t nLen = 0; for (int32_t i = 0; i < numOfCols; ++i) { pField = taosArrayGet(pFieldList, i); - if (!isValidDataType(pField->type) || pField->type == TSDB_DATA_TYPE_JSON) { + if (!isValidDataType(pField->type) || IS_JSON_DATA_TYPE(pField->type)) { invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg4); return false; } @@ -1505,7 +1505,7 @@ static bool validateTagParams(SArray* pTagsList, SArray* pFieldList, SSqlCmd* pC return false; } - if (p->type == TSDB_DATA_TYPE_JSON && numOfTags != 1) { + if (IS_JSON_DATA_TYPE(p->type) && numOfTags != 1) { invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg8); return false; } @@ -1592,7 +1592,7 @@ int32_t validateOneTag(SSqlCmd* pCmd, TAOS_FIELD* pTagField) { // invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1); // return false; //} - if (pTagField->type == TSDB_DATA_TYPE_JSON) { + if (IS_JSON_DATA_TYPE(pTagField->type)) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg8); } @@ -1603,7 +1603,7 @@ int32_t validateOneTag(SSqlCmd* pCmd, TAOS_FIELD* pTagField) { SSchema* pTagSchema = tscGetTableTagSchema(pTableMetaInfo->pTableMeta); int32_t nLen = 0; - if (numOfTags == 1 && pTagSchema[0].type == TSDB_DATA_TYPE_JSON){ + if (numOfTags == 1 && IS_JSON_DATA_TYPE(pTagSchema[0].type)){ return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg8); } @@ -2319,7 +2319,7 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t } SSchema* pSchema = tscGetTableColumnSchema(pTableMeta, index.columnIndex); - if (tokenId == TK_ARROW && pSchema->type != TSDB_DATA_TYPE_JSON) { + if (tokenId == TK_ARROW && !IS_JSON_DATA_TYPE(pSchema->type)) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg4); } @@ -4471,7 +4471,7 @@ static int32_t validateMatchExpr(tSqlExpr* pExpr, STableMeta* pTableMeta, int32_ return invalidOperationMsg(msgBuf, msg2); } - if(pLeft->tokenId == TK_ARROW && pSchema[index].type == TSDB_DATA_TYPE_JSON && !JSON_TYPE_BINARY){ + if(pLeft->tokenId == TK_ARROW && pSchema[index].type == TSDB_DATA_TYPE_JSON_NCHAR){ return invalidOperationMsg(msgBuf, msg4); } @@ -4648,7 +4648,7 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSql } // check for json tag operation -> and ? - if (pSchema->type == TSDB_DATA_TYPE_JSON){ + if (IS_JSON_DATA_TYPE(pSchema->type)){ code = validateJsonTagExpr(*pExpr, tscGetErrorMsgPayload(pCmd)); if (code != TSDB_CODE_SUCCESS) { return code; @@ -6149,7 +6149,7 @@ int32_t setAlterTableInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { d += sizeof(STColumn); } - if (pTagsSchema->type == TSDB_DATA_TYPE_JSON){ + if (IS_JSON_DATA_TYPE(pTagsSchema->type)){ SKVRowBuilder kvRowBuilder = {0}; if (tdInitKVRowBuilder(&kvRowBuilder) < 0) { return TSDB_CODE_TSC_OUT_OF_MEMORY; @@ -6168,7 +6168,7 @@ int32_t setAlterTableInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { } tdAddColToKVRow(&kvRowBuilder, pTagsSchema->colId, pTagsSchema->type, tagVal, false); - code = parseJsontoTagData(pItem->pVar.pz, &kvRowBuilder, pMsg, pTagsSchema->colId); + code = parseJsontoTagData(pItem->pVar.pz, &kvRowBuilder, pMsg, pTagsSchema->colId, pTagsSchema->type); if (code != TSDB_CODE_SUCCESS) { tdDestroyKVRowBuilder(&kvRowBuilder); return code; @@ -6196,7 +6196,7 @@ int32_t setAlterTableInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { } int32_t len = 0; - if(pTagsSchema->type == TSDB_DATA_TYPE_JSON){ + if(IS_JSON_DATA_TYPE(pTagsSchema->type)){ len = kvRowLen(pUpdateMsg->data + schemaLen); }else if (!IS_VAR_DATA_TYPE(pTagsSchema->type)) { len = tDataTypes[pTagsSchema->type].bytes; @@ -7700,7 +7700,7 @@ int32_t doCheckForCreateFromStable(SSqlObj* pSql, SSqlInfo* pInfo) { } else if (pItem->pVar.nType == TSDB_DATA_TYPE_TIMESTAMP) { pItem->pVar.i64 = convertTimePrecision(pItem->pVar.i64, TSDB_TIME_PRECISION_NANO, tinfo.precision); } - } else if (pSchema->type == TSDB_DATA_TYPE_JSON) { + } else if (IS_JSON_DATA_TYPE(pSchema->type)) { if (pItem->pVar.nLen > TSDB_MAX_TAGS_LEN) { tdDestroyKVRowBuilder(&kvRowBuilder); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3); @@ -7760,7 +7760,7 @@ int32_t doCheckForCreateFromStable(SSqlObj* pSql, SSqlInfo* pInfo) { } else if (pItem->pVar.nType == TSDB_DATA_TYPE_TIMESTAMP) { pItem->pVar.i64 = convertTimePrecision(pItem->pVar.i64, TSDB_TIME_PRECISION_NANO, tinfo.precision); } - } else if (pSchema->type == TSDB_DATA_TYPE_JSON) { + } else if (IS_JSON_DATA_TYPE(pSchema->type)) { if (pItem->pVar.nLen > pSchema->bytes) { tdDestroyKVRowBuilder(&kvRowBuilder); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3); @@ -7788,7 +7788,7 @@ int32_t doCheckForCreateFromStable(SSqlObj* pSql, SSqlInfo* pInfo) { } // encode json tag string - if(schemaSize == 1 && pTagSchema[0].type == TSDB_DATA_TYPE_JSON){ + if(schemaSize == 1 && IS_JSON_DATA_TYPE(pTagSchema[0].type)){ if (valSize != schemaSize) { tdDestroyKVRowBuilder(&kvRowBuilder); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg5); @@ -7799,7 +7799,7 @@ int32_t doCheckForCreateFromStable(SSqlObj* pSql, SSqlInfo* pInfo) { tdDestroyKVRowBuilder(&kvRowBuilder); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg6); } - ret = parseJsontoTagData(pItem->pVar.pz, &kvRowBuilder, tscGetErrorMsgPayload(pCmd), pTagSchema[0].colId); + ret = parseJsontoTagData(pItem->pVar.pz, &kvRowBuilder, tscGetErrorMsgPayload(pCmd), pTagSchema[0].colId, pTagSchema[0].type); if (ret != TSDB_CODE_SUCCESS) { tdDestroyKVRowBuilder(&kvRowBuilder); return ret; @@ -7813,7 +7813,7 @@ int32_t doCheckForCreateFromStable(SSqlObj* pSql, SSqlInfo* pInfo) { } tdSortKVRowByColIdx(row); pTag->dataLen = kvRowLen(row); - if(schemaSize == 1 && pTagSchema[0].type == TSDB_DATA_TYPE_JSON){ + if(schemaSize == 1 && IS_JSON_DATA_TYPE(pTagSchema[0].type)){ if(kvRowLen(row) >= pTagSchema[0].bytes){ // reserve 1 byte for select char tmp[128]= {0}; sprintf(tmp, "tag value is too small, can not contain encoded json tag:%d|%d", kvRowLen(row), pTagSchema[0].bytes); diff --git a/src/client/src/tscSql.c b/src/client/src/tscSql.c index c5b7d5e119ff72b2bfaa7d2cf5cfb998cc911268..ec05432940a18279a956543093240c5d665da3cf 100644 --- a/src/client/src/tscSql.c +++ b/src/client/src/tscSql.c @@ -439,9 +439,9 @@ TAOS_FIELD *taos_fetch_fields(TAOS_RES *res) { f[j] = pField->field; // revise the length for binary and nchar fields - if (f[j].type == TSDB_DATA_TYPE_BINARY || f[j].type == TSDB_DATA_TYPE_JSON) { + if (f[j].type == TSDB_DATA_TYPE_BINARY || f[j].type == TSDB_DATA_TYPE_JSON_BINARY) { f[j].bytes -= VARSTR_HEADER_SIZE; - } else if (f[j].type == TSDB_DATA_TYPE_NCHAR) { + } else if (f[j].type == TSDB_DATA_TYPE_NCHAR || f[j].type == TSDB_DATA_TYPE_JSON_NCHAR) { f[j].bytes = (f[j].bytes - VARSTR_HEADER_SIZE)/TSDB_NCHAR_SIZE; } diff --git a/src/client/src/tscSubquery.c b/src/client/src/tscSubquery.c index 967f364aab20e1756c4751466fae306fbd53cf48..010865cbfd940d940da0bf747180721d806818de 100644 --- a/src/client/src/tscSubquery.c +++ b/src/client/src/tscSubquery.c @@ -3552,7 +3552,7 @@ TAOS_ROW doSetResultRowData(SSqlObj *pSql) { int32_t type = pInfo->field.type; int32_t bytes = pInfo->field.bytes; - if (type != TSDB_DATA_TYPE_BINARY && type != TSDB_DATA_TYPE_NCHAR && type != TSDB_DATA_TYPE_JSON) { + if (!IS_VAR_DATA_TYPE(type) && !IS_JSON_DATA_TYPE(type)) { pRes->tsrow[j] = isNull(pRes->urow[i], type) ? NULL : pRes->urow[i]; } else { pRes->tsrow[j] = isNull(pRes->urow[i], type) ? NULL : varDataVal(pRes->urow[i]); diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c index afb5deca8886681459085b0c6cc5aca62cd15f33..b2531c4588d11707598855f676b89ad01b2815de 100644 --- a/src/client/src/tscUtil.c +++ b/src/client/src/tscUtil.c @@ -73,7 +73,8 @@ int32_t converToStr(char *str, int type, void *buf, int32_t bufSize, int32_t *le case TSDB_DATA_TYPE_BINARY: case TSDB_DATA_TYPE_NCHAR: - case TSDB_DATA_TYPE_JSON: + case TSDB_DATA_TYPE_JSON_BINARY: + case TSDB_DATA_TYPE_JSON_NCHAR: if (bufSize < 0) { tscError("invalid buf size"); return TSDB_CODE_TSC_INVALID_VALUE; @@ -714,7 +715,7 @@ static void setResRawPtrImpl(SSqlRes* pRes, SInternalField* pInfo, int32_t i, bo } memcpy(pRes->urow[i], pRes->buffer[i], pInfo->field.bytes * pRes->numOfRows); - }else if (pInfo->field.type == TSDB_DATA_TYPE_JSON) { + }else if (IS_JSON_DATA_TYPE(pInfo->field.type)) { // convert unicode to native code in a temporary buffer extra one byte for terminated symbol char* buffer = realloc(pRes->buffer[i], pInfo->field.bytes * pRes->numOfRows); if(buffer == NULL) @@ -728,7 +729,7 @@ static void setResRawPtrImpl(SSqlRes* pRes, SInternalField* pInfo, int32_t i, bo char* dst = pRes->buffer[i] + k * pInfo->field.bytes; char* realData = p + CHAR_BYTES; if (*p == SELECT_ALL_JSON_TAG){ - char* json = parseTagDatatoJson(realData); + char* json = parseTagDatatoJson(realData, pInfo->field.type); if(json) { memcpy(varDataVal(dst), json, strlen(json)); varDataSetLen(dst, strlen(json)); @@ -5175,8 +5176,8 @@ char* cloneCurrentDBName(SSqlObj* pSql) { return p; } -void findTagValue(STable* data, char* key, int32_t keyLen, char* out, int16_t len){ - void* result = getJsonTagValue(data, key, keyLen); +void findTagValue(STable* data, char* key, int32_t keyLen, char* out, int16_t len, uint8_t jsonType){ + void* result = getJsonTagValue(data, key, keyLen, jsonType); if (result == NULL){ // json key no result return; } @@ -5214,7 +5215,7 @@ void findTagValue(STable* data, char* key, int32_t keyLen, char* out, int16_t le } } -char* parseTagDatatoJson(void *p){ +char* parseTagDatatoJson(void *p, uint8_t tagType){ char* string = NULL; cJSON *json = cJSON_CreateObject(); if (json == NULL) @@ -5235,9 +5236,9 @@ char* parseTagDatatoJson(void *p){ } if (j%2 != 0) { // json key memset(tagJsonKey, 0, TSDB_MAX_TAGS_LEN); - if (JSON_TYPE_BINARY){ + if (tagType == TSDB_DATA_TYPE_JSON_BINARY){ strncpy(tagJsonKey, varDataVal(val), varDataLen(val)); - } else if(JSON_TYPE_NCHAR){ + } else if(tagType == TSDB_DATA_TYPE_JSON_NCHAR){ int32_t length = taosUcs4ToMbs(varDataVal(val), varDataLen(val), tagJsonKey); if (length == 0) { tscError("charset:%s to %s. val:%s convert json key failed.", DEFAULT_UNICODE_ENCODEC, tsCharset, (char*)val); @@ -5293,7 +5294,7 @@ end: return string; } -int parseJsontoTagData(char* json, SKVRowBuilder* kvRowBuilder, char* errMsg, int16_t startColId){ +int parseJsontoTagData(char* json, SKVRowBuilder* kvRowBuilder, char* errMsg, int16_t startColId, uint8_t type){ cJSON *root = cJSON_Parse(json); if (root == NULL){ tscError("json parse error"); @@ -5324,10 +5325,10 @@ int parseJsontoTagData(char* json, SKVRowBuilder* kvRowBuilder, char* errMsg, in char tagVal[TSDB_MAX_TAGS_LEN] = {0}; int32_t outLen = 0; - if (JSON_TYPE_BINARY){ + if (type == TSDB_DATA_TYPE_JSON_BINARY){ strncpy(varDataVal(tagVal), item->string, strlen(item->string)); outLen = strlen(item->string); - }else if(JSON_TYPE_NCHAR){ + }else if(type == TSDB_DATA_TYPE_JSON_NCHAR){ if (!taosMbsToUcs4(item->string, strlen(item->string), varDataVal(tagVal), TSDB_MAX_TAGS_LEN - VARSTR_HEADER_SIZE, &outLen)) { tscError("json string error:%s|%s", strerror(errno), item->string); retCode = tscSQLSyntaxErrMsg(errMsg, "serizelize json error", NULL); @@ -5341,12 +5342,12 @@ int parseJsontoTagData(char* json, SKVRowBuilder* kvRowBuilder, char* errMsg, in memset(tagVal, 0, TSDB_MAX_TAGS_LEN); if(item->type == cJSON_String){ // add json value format: type|data outLen = 0; - *tagVal = jsonType2DbType(0, item->type); // type + *tagVal = jsonType2DbType(0, item->type, type); // type char* tagData = POINTER_SHIFT(tagVal,CHAR_BYTES); - if (JSON_TYPE_BINARY){ + if (type == TSDB_DATA_TYPE_JSON_BINARY){ strncpy(varDataVal(tagData), item->valuestring, strlen(item->valuestring)); outLen = strlen(item->valuestring); - }else if(JSON_TYPE_NCHAR) { + }else if(type == TSDB_DATA_TYPE_JSON_NCHAR) { if (!taosMbsToUcs4(item->valuestring, strlen(item->valuestring), varDataVal(tagData), TSDB_MAX_TAGS_LEN - VARSTR_HEADER_SIZE, &outLen)) { tscError("json string error:%s|%s", strerror(errno), item->string); @@ -5358,7 +5359,7 @@ int parseJsontoTagData(char* json, SKVRowBuilder* kvRowBuilder, char* errMsg, in varDataSetLen(tagData, outLen); tdAddColToKVRow(kvRowBuilder, jsonIndex++, TSDB_DATA_TYPE_NCHAR, tagVal, true); }else if(item->type == cJSON_Number){ - *tagVal = jsonType2DbType(item->valuedouble, item->type); // type + *tagVal = jsonType2DbType(item->valuedouble, item->type, type); // type char* tagData = POINTER_SHIFT(tagVal,CHAR_BYTES); if(*tagVal == TSDB_DATA_TYPE_DOUBLE) *((double *)tagData) = item->valuedouble; else if(*tagVal == TSDB_DATA_TYPE_BIGINT) *((int64_t *)tagData) = item->valueint; @@ -5374,19 +5375,19 @@ end: return retCode; } -int8_t jsonType2DbType(double data, int jsonType){ +int8_t jsonType2DbType(double data, int jsonType, uint8_t type){ switch(jsonType){ case cJSON_Number: if (data - (int64_t)data > 0) return TSDB_DATA_TYPE_DOUBLE; else return TSDB_DATA_TYPE_BIGINT; case cJSON_String: - if (JSON_TYPE_NCHAR) return TSDB_DATA_TYPE_NCHAR; else return TSDB_DATA_TYPE_BINARY; + if (type == TSDB_DATA_TYPE_JSON_NCHAR) return TSDB_DATA_TYPE_NCHAR; else return TSDB_DATA_TYPE_BINARY; } return TSDB_DATA_TYPE_NULL; } -void* getJsonTagValue(STable* pTable, char* key, int32_t keyLen){ +void* getJsonTagValue(STable* pTable, char* key, int32_t keyLen, uint8_t jsonType){ int32_t outLen = 0; - if(JSON_TYPE_NCHAR){ + if(jsonType == TSDB_DATA_TYPE_JSON_NCHAR){ char tagKey[256] = {0}; if (!taosMbsToUcs4(key, keyLen, tagKey, 256, &outLen)) { tscError("json key to ucs4 error:%s|%s", strerror(errno), key); diff --git a/src/common/src/tname.c b/src/common/src/tname.c index de6bdd5003555ca16e77f5bd73c0395c98128a7d..0e96a1523c54f791e3ce2786be91522df9486d2c 100644 --- a/src/common/src/tname.c +++ b/src/common/src/tname.c @@ -190,7 +190,7 @@ static bool doValidateSchema(SSchema* pSchema, int32_t numOfCols, int32_t maxLen int32_t rowLen = 0; for (int32_t i = 0; i < numOfCols; ++i) { - if (pSchema[i].type == TSDB_DATA_TYPE_JSON && numOfCols != 1){ + if (IS_JSON_DATA_TYPE(pSchema[i].type) && numOfCols != 1){ return false; } // 1. valid types @@ -199,11 +199,11 @@ static bool doValidateSchema(SSchema* pSchema, int32_t numOfCols, int32_t maxLen } // 2. valid length for each type - if (pSchema[i].type == TSDB_DATA_TYPE_BINARY || (pSchema[i].type == TSDB_DATA_TYPE_JSON && JSON_TYPE_BINARY)) { + if (pSchema[i].type == TSDB_DATA_TYPE_BINARY || pSchema[i].type == TSDB_DATA_TYPE_JSON_BINARY) { if (pSchema[i].bytes > TSDB_MAX_BINARY_LEN) { return false; } - } else if (pSchema[i].type == TSDB_DATA_TYPE_NCHAR || (pSchema[i].type == TSDB_DATA_TYPE_JSON && JSON_TYPE_NCHAR)) { + } else if (pSchema[i].type == TSDB_DATA_TYPE_NCHAR || pSchema[i].type == TSDB_DATA_TYPE_JSON_NCHAR) { if (pSchema[i].bytes > TSDB_MAX_NCHAR_LEN) { return false; } diff --git a/src/common/src/ttypes.c b/src/common/src/ttypes.c index 67ae79b01128130997977604506009827cd8d730..29822c32a4303993a7802d14ae947068a214bb96 100644 --- a/src/common/src/ttypes.c +++ b/src/common/src/ttypes.c @@ -17,9 +17,8 @@ #include "ttype.h" #include "ttokendef.h" #include "tscompression.h" -#include "tglobal.h" -const int32_t TYPE_BYTES[16] = { +const int32_t TYPE_BYTES[17] = { -1, // TSDB_DATA_TYPE_NULL sizeof(int8_t), // TSDB_DATA_TYPE_BOOL sizeof(int8_t), // TSDB_DATA_TYPE_TINYINT @@ -35,7 +34,8 @@ const int32_t TYPE_BYTES[16] = { sizeof(uint16_t), // TSDB_DATA_TYPE_USMALLINT sizeof(uint32_t), // TSDB_DATA_TYPE_UINT sizeof(uint64_t), // TSDB_DATA_TYPE_UBIGINT - sizeof(int8_t), // TSDB_DATA_TYPE_JSON + sizeof(int8_t), // TSDB_DATA_TYPE_JSON_BINARY + sizeof(int8_t), // TSDB_DATA_TYPE_JSON_NCHAR }; #define DO_STATICS(__sum, __min, __max, __minIndex, __maxIndex, _list, _index) \ @@ -369,17 +369,7 @@ static void getStatics_nchr(const void *pData, int32_t numOfRow, int64_t *min, i *maxIndex = 0; } -static void getStatics_json(const void *pData, int32_t numOfRow, int64_t *min, int64_t *max, - int64_t *sum, int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) { - if (JSON_TYPE_NCHAR) { - getStatics_nchr(pData, numOfRow, min, max, sum, minIndex, maxIndex, numOfNull); - } - else{ - getStatics_bin(pData, numOfRow, min, max, sum, minIndex, maxIndex, numOfNull); - } -} - -tDataTypeDescriptor tDataTypes[16] = { +tDataTypeDescriptor tDataTypes[17] = { {TSDB_DATA_TYPE_NULL, 6, 1, "NOTYPE", 0, 0, NULL, NULL, NULL}, {TSDB_DATA_TYPE_BOOL, 4, CHAR_BYTES, "BOOL", false, true, tsCompressBool, tsDecompressBool, getStatics_bool}, {TSDB_DATA_TYPE_TINYINT, 7, CHAR_BYTES, "TINYINT", INT8_MIN, INT8_MAX, tsCompressTinyint, tsDecompressTinyint, getStatics_i8}, @@ -395,7 +385,8 @@ tDataTypeDescriptor tDataTypes[16] = { {TSDB_DATA_TYPE_USMALLINT, 17, SHORT_BYTES, "SMALLINT UNSIGNED", 0, UINT16_MAX, tsCompressSmallint, tsDecompressSmallint, getStatics_u16}, {TSDB_DATA_TYPE_UINT, 12, INT_BYTES, "INT UNSIGNED", 0, UINT32_MAX, tsCompressInt, tsDecompressInt, getStatics_u32}, {TSDB_DATA_TYPE_UBIGINT, 15, LONG_BYTES, "BIGINT UNSIGNED", 0, UINT64_MAX, tsCompressBigint, tsDecompressBigint, getStatics_u64}, - {TSDB_DATA_TYPE_JSON, 4, 0, "JSON", 0, 0, tsCompressString, tsDecompressString, getStatics_json}, + {TSDB_DATA_TYPE_JSON_BINARY,11, 0, "JSON BINARY", 0, 0, tsCompressString, tsDecompressString, getStatics_bin}, + {TSDB_DATA_TYPE_JSON_NCHAR, 10, 0, "JSON NCHAR", 0, 0, tsCompressString, tsDecompressString, getStatics_nchr}, }; char tTokenTypeSwitcher[13] = { @@ -441,7 +432,7 @@ FORCE_INLINE void* getDataMax(int32_t type) { bool isValidDataType(int32_t type) { - return type >= TSDB_DATA_TYPE_NULL && type <= TSDB_DATA_TYPE_JSON; + return type >= TSDB_DATA_TYPE_NULL && type <= TSDB_DATA_TYPE_JSON_NCHAR; } void setVardataNull(void* val, int32_t type) { diff --git a/src/common/src/tvariant.c b/src/common/src/tvariant.c index b4451ca302807e6f70c3be74afd4770210f78946..7bb21387ecdce94139e5d0ad968d72f9ba42da49 100644 --- a/src/common/src/tvariant.c +++ b/src/common/src/tvariant.c @@ -158,7 +158,8 @@ void tVariantCreateFromBinary(tVariant *pVar, const char *pz, size_t len, uint32 pVar->dKey = GET_FLOAT_VAL(pz); break; } - case TSDB_DATA_TYPE_NCHAR: { // here we get the nchar length from raw binary bits length + case TSDB_DATA_TYPE_NCHAR: + case TSDB_DATA_TYPE_JSON_NCHAR:{ // here we get the nchar length from raw binary bits length size_t lenInwchar = len / TSDB_NCHAR_SIZE; pVar->wpz = calloc(1, (lenInwchar + 1) * TSDB_NCHAR_SIZE); @@ -168,7 +169,7 @@ void tVariantCreateFromBinary(tVariant *pVar, const char *pz, size_t len, uint32 break; } case TSDB_DATA_TYPE_BINARY: - case TSDB_DATA_TYPE_JSON:{ + case TSDB_DATA_TYPE_JSON_BINARY:{ pVar->pz = calloc(len + 1, sizeof(char)); memcpy(pVar->pz, pz, len); pVar->nLen = (int32_t)len; @@ -919,14 +920,17 @@ int32_t tVariantDumpEx(tVariant *pVariant, char *payload, int16_t type, bool inc break; } - case TSDB_DATA_TYPE_JSON: { + case TSDB_DATA_TYPE_JSON_BINARY: + case TSDB_DATA_TYPE_JSON_NCHAR:{ if (pVariant->nType == TSDB_DATA_TYPE_NULL) { *(int8_t *)payload = TSDB_DATA_TINYINT_NULL; } else if (pVariant->nType == TSDB_DATA_TYPE_BINARY){ *((int8_t *)payload) = TSDB_DATA_BINARY_PLACEHOLDER; - } else if (pVariant->nType == TSDB_DATA_TYPE_JSON){ // select * from stable, set tag type to json,from setTagValue/tag_project_function + } else if (pVariant->nType == TSDB_DATA_TYPE_JSON_BINARY){ // select * from stable, set tag type to json,from setTagValue/tag_project_function memcpy(payload, pVariant->pz, pVariant->nLen); - } else { + } else if(pVariant->nType == TSDB_DATA_TYPE_JSON_NCHAR){ + memcpy(payload, pVariant->wpz, pVariant->nLen); + }else { return -1; } break; diff --git a/src/inc/taos.h b/src/inc/taos.h index 0ed2a04d8d66b4a20a687725c437762a75971ea9..6c3885aec46dba70cfcd74aff0a704e3ab554560 100644 --- a/src/inc/taos.h +++ b/src/inc/taos.h @@ -46,7 +46,8 @@ typedef void **TAOS_ROW; #define TSDB_DATA_TYPE_USMALLINT 12 // 2 bytes #define TSDB_DATA_TYPE_UINT 13 // 4 bytes #define TSDB_DATA_TYPE_UBIGINT 14 // 8 bytes -#define TSDB_DATA_TYPE_JSON 15 // json string +#define TSDB_DATA_TYPE_JSON_BINARY 15 // json string +#define TSDB_DATA_TYPE_JSON_NCHAR 16 // json unicode string typedef enum { TSDB_OPTION_LOCALE, diff --git a/src/inc/taosdef.h b/src/inc/taosdef.h index 1ea5246ae4533bedd8bec63d5a8b8a618c8334ee..807ed02eddd97ab8e2d405e7c5f1653de3c40583 100644 --- a/src/inc/taosdef.h +++ b/src/inc/taosdef.h @@ -39,7 +39,7 @@ extern "C" { #define TSKEY_INITIAL_VAL INT64_MIN // Bytes for each type. -extern const int32_t TYPE_BYTES[16]; +extern const int32_t TYPE_BYTES[17]; // TODO: replace and remove code below #define CHAR_BYTES sizeof(char) diff --git a/src/inc/ttype.h b/src/inc/ttype.h index e73e4499c89bf86ee7ca080c05c8e1b4d133ed17..769527291dcd9f4dd5e5743cd6881fbe5eab9967 100644 --- a/src/inc/ttype.h +++ b/src/inc/ttype.h @@ -41,6 +41,7 @@ typedef struct { #define varDataLenByData(v) (*(VarDataLenT *)(((char*)(v)) - VARSTR_HEADER_SIZE)) #define varDataSetLen(v, _len) (((VarDataLenT *)(v))[0] = (VarDataLenT) (_len)) #define IS_VAR_DATA_TYPE(t) (((t) == TSDB_DATA_TYPE_BINARY) || ((t) == TSDB_DATA_TYPE_NCHAR)) +#define IS_JSON_DATA_TYPE(t) (((t) == TSDB_DATA_TYPE_JSON_BINARY) || ((t) == TSDB_DATA_TYPE_JSON_NCHAR)) #define varDataNetLen(v) (htons(((VarDataLenT *)(v))[0])) #define varDataNetTLen(v) (sizeof(VarDataLenT) + varDataNetLen(v)) @@ -192,7 +193,7 @@ typedef struct tDataTypeDescriptor { int16_t *minindex, int16_t *maxindex, int16_t *numofnull); } tDataTypeDescriptor; -extern tDataTypeDescriptor tDataTypes[16]; +extern tDataTypeDescriptor tDataTypes[17]; bool isValidDataType(int32_t type); diff --git a/src/kit/shell/src/shellEngine.c b/src/kit/shell/src/shellEngine.c index 7f0d1e58fcc1acc9ae5ccf367b23f8182b07ec5b..cc2abb82084d674692d19adbec94cff080e8f419 100644 --- a/src/kit/shell/src/shellEngine.c +++ b/src/kit/shell/src/shellEngine.c @@ -683,7 +683,8 @@ static void printField(const char* val, TAOS_FIELD* field, int width, int32_t le break; case TSDB_DATA_TYPE_BINARY: case TSDB_DATA_TYPE_NCHAR: - case TSDB_DATA_TYPE_JSON: + case TSDB_DATA_TYPE_JSON_BINARY: + case TSDB_DATA_TYPE_JSON_NCHAR: shellPrintNChar(val, length, width); break; case TSDB_DATA_TYPE_TIMESTAMP: @@ -791,13 +792,15 @@ static int calcColWidth(TAOS_FIELD* field, int precision) { return MAX(25, width); case TSDB_DATA_TYPE_BINARY: + case TSDB_DATA_TYPE_JSON_BINARY: if (field->bytes > tsMaxBinaryDisplayWidth) { return MAX(tsMaxBinaryDisplayWidth, width); } else { return MAX(field->bytes, width); } - case TSDB_DATA_TYPE_NCHAR: { + case TSDB_DATA_TYPE_NCHAR: + case TSDB_DATA_TYPE_JSON_NCHAR:{ int16_t bytes = field->bytes * TSDB_NCHAR_SIZE; if (bytes > tsMaxBinaryDisplayWidth) { return MAX(tsMaxBinaryDisplayWidth, width); @@ -805,12 +808,6 @@ static int calcColWidth(TAOS_FIELD* field, int precision) { return MAX(bytes, width); } } - case TSDB_DATA_TYPE_JSON: - if (field->bytes > tsMaxBinaryDisplayWidth) { - return MAX(tsMaxBinaryDisplayWidth, width); - } else { - return MAX(field->bytes, width); - } case TSDB_DATA_TYPE_TIMESTAMP: if (args.is_raw_time) { diff --git a/src/query/inc/qFilter.h b/src/query/inc/qFilter.h index 9b04886b041b7e89a240b444a014b936350954d6..2a522c9a6bb98e0f1eab2ce9d4a1ec6cf52b26aa 100644 --- a/src/query/inc/qFilter.h +++ b/src/query/inc/qFilter.h @@ -252,7 +252,7 @@ typedef struct SFilterInfo { #define COL_FIELD_SIZE (sizeof(SFilterField) + 2 * sizeof(int64_t)) -#define FILTER_NO_MERGE_DATA_TYPE(t) ((t) == TSDB_DATA_TYPE_BINARY || (t) == TSDB_DATA_TYPE_NCHAR || (t) == TSDB_DATA_TYPE_JSON) +#define FILTER_NO_MERGE_DATA_TYPE(t) ((t) == TSDB_DATA_TYPE_BINARY || (t) == TSDB_DATA_TYPE_NCHAR || (t) == TSDB_DATA_TYPE_JSON_BINARY || (t) == TSDB_DATA_TYPE_JSON_NCHAR) #define FILTER_NO_MERGE_OPTR(o) ((o) == TSDB_RELATION_ISNULL || (o) == TSDB_RELATION_NOTNULL || (o) == FILTER_DUMMY_EMPTY_OPTR) #define MR_EMPTY_RES(ctx) (ctx->rs == NULL) diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c index 91dace974b616430238fe0f2367a03a27f7d98e1..e37983f742445d9c97499675c784457dd5c7e2d2 100644 --- a/src/query/src/qExecutor.c +++ b/src/query/src/qExecutor.c @@ -3352,12 +3352,12 @@ static void doSetTagValueInParam(void* pTable, int32_t tagColId, tVariant *tag, return; } - if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) { + if (IS_VAR_DATA_TYPE(type)) { int32_t maxLen = bytes - VARSTR_HEADER_SIZE; int32_t len = (varDataLen(val) > maxLen)? maxLen:varDataLen(val); tVariantCreateFromBinary(tag, varDataVal(val), len, type); //tVariantCreateFromBinary(tag, varDataVal(val), varDataLen(val), type); - } else if(type == TSDB_DATA_TYPE_JSON){ + } else if(IS_JSON_DATA_TYPE(type)){ assert(kvRowLen(val) < bytes); tVariantCreateFromBinary(tag, val, bytes, type); memcpy(tag->pz + 1, tag->pz, bytes - 1); // move back 1 byte for select type @@ -4334,7 +4334,7 @@ static void doCopyQueryResultToMsg(SQInfo *pQInfo, int32_t numOfRows, char *data *compLen += compSizes[col]; compSizes[col] = htonl(compSizes[col]); } else { - if(pColRes->info.type == TSDB_DATA_TYPE_JSON){ // todo json + if(IS_JSON_DATA_TYPE(pColRes->info.type)){ // todo json //pColRes->info.bytes = } @@ -7185,11 +7185,11 @@ static SSDataBlock* doTagScan(void* param, bool* newgroup) { if (pExprInfo[j].base.colInfo.colId == TSDB_TBNAME_COLUMN_INDEX) { data = tsdbGetTableName(item->pTable); } else { - if(type == TSDB_DATA_TYPE_JSON){ + if(IS_JSON_DATA_TYPE(type)){ data = tsdbGetTableTagVal(item->pTable, pExprInfo[j].base.colInfo.colId, type, bytes); if(pExprInfo[j].base.numOfParams > 0){ // tag-> operation char* tagJsonElementData = calloc(bytes, 1); - findTagValue(item->pTable, pExprInfo[j].base.param[0].pz, pExprInfo[j].base.param[0].nLen, tagJsonElementData, bytes); + findTagValue(item->pTable, pExprInfo[j].base.param[0].pz, pExprInfo[j].base.param[0].nLen, tagJsonElementData, bytes, type); *dst = SELECT_ELEMENT_JSON_TAG; // select tag->element dst++; assert(varDataTLen(tagJsonElementData) < bytes); diff --git a/src/query/src/qFilter.c b/src/query/src/qFilter.c index a57637e9536c4f74acccc74f4e2e4874ae263dd5..459e823c3f7b4bac23b18e18a0a693d60781f18c 100644 --- a/src/query/src/qFilter.c +++ b/src/query/src/qFilter.c @@ -44,7 +44,7 @@ static FORCE_INLINE int32_t filterFieldColDescCompare(const void *desc1, const v const SSchema *sch1 = desc1; const SSchema *sch2 = desc2; - if(sch1->type == TSDB_DATA_TYPE_JSON && sch2->type == TSDB_DATA_TYPE_JSON){ + if(IS_JSON_DATA_TYPE(sch1->type) && IS_JSON_DATA_TYPE(sch2->type)){ return !(strcmp(sch1->name, sch2->name) == 0 && sch1->colId == sch2->colId); } else{ @@ -1189,10 +1189,10 @@ int32_t filterAddGroupUnitFromNode(SFilterInfo *info, tExprNode* tree, SArray *g if(pLeft->nodeType == TSQL_NODE_EXPR && pLeft->_node.optr == TSDB_RELATION_ARROW){ // json tag -> operation assert(info->pTable != NULL); SSchema* schema = FILTER_GET_COL_FIELD_DESC(FILTER_GET_FIELD(info, left)); - void* data = getJsonTagValue(info->pTable, schema->name, strlen(schema->name)); + void* data = getJsonTagValue(info->pTable, schema->name, strlen(schema->name), schema->type); if(data == NULL) return TSDB_CODE_QRY_JSON_KEY_NOT_EXIST; type = *(char*)data; - assert(type > TSDB_DATA_TYPE_NULL && type < TSDB_DATA_TYPE_JSON); + assert(type > TSDB_DATA_TYPE_NULL && type < TSDB_DATA_TYPE_JSON_BINARY); } if (tree->_node.optr == TSDB_RELATION_IN && (!IS_VAR_DATA_TYPE(type))) { @@ -3196,12 +3196,12 @@ int32_t filterSetJsonColFieldData(SFilterInfo *info, void *param, filer_get_col_ int filterJsonTypeConvert(SFilterInfo* info) { for(int i = 0; i < info->fields[FLD_TYPE_COLUMN].num; i++) { SSchema* schema = info->fields[FLD_TYPE_COLUMN].fields[i].desc; - if(schema->type == TSDB_DATA_TYPE_JSON){ + if(IS_JSON_DATA_TYPE(schema->type)){ if(schema->colId != 0){ // schema->colId != 0 means not ? operation - void* data = getJsonTagValue(info->pTable, schema->name, strlen(schema->name)); + void* data = getJsonTagValue(info->pTable, schema->name, strlen(schema->name), schema->type); if(data == NULL) return TSDB_CODE_QRY_JSON_KEY_NOT_EXIST; int8_t type = *(char*)data; - assert(type > TSDB_DATA_TYPE_NULL && type < TSDB_DATA_TYPE_JSON); + assert(type > TSDB_DATA_TYPE_NULL && type < TSDB_DATA_TYPE_JSON_BINARY); schema->type = type; }else{ schema->type = TSDB_DATA_TYPE_BINARY; @@ -3209,7 +3209,7 @@ int filterJsonTypeConvert(SFilterInfo* info) { } } for(int i = 0; i < info->unitNum; i++){ - if(info->units[i].compare.type == TSDB_DATA_TYPE_JSON){ + if(IS_JSON_DATA_TYPE(info->units[i].compare.type)){ SFilterField *colLeft = FILTER_UNIT_LEFT_FIELD(info, &info->units[i]); info->units[i].compare.type = FILTER_GET_COL_FIELD_TYPE(colLeft); diff --git a/src/query/src/qSqlParser.c b/src/query/src/qSqlParser.c index 1c110c51a5e65e75465ff5b6c9502ef88e1c9d96..34bac367daf111af91f94b8645776c5c2876ff2d 100644 --- a/src/query/src/qSqlParser.c +++ b/src/query/src/qSqlParser.c @@ -702,6 +702,18 @@ void tSetColumnType(TAOS_FIELD *pField, SStrToken *type) { break; } + if((type->n == 4) && + (strncasecmp(type->z, "json", type->n) == 0) && JSON_TYPE_NCHAR){ + i = TSDB_DATA_TYPE_JSON_NCHAR; + break; + } + + if((type->n == 4) && + (strncasecmp(type->z, "json", type->n) == 0) && JSON_TYPE_BINARY){ + i = TSDB_DATA_TYPE_JSON_BINARY; + break; + } + i += 1; } @@ -716,7 +728,7 @@ void tSetColumnType(TAOS_FIELD *pField, SStrToken *type) { pField->type = i; pField->bytes = tDataTypes[i].bytes; - if (i == TSDB_DATA_TYPE_NCHAR || (i == TSDB_DATA_TYPE_JSON && JSON_TYPE_NCHAR)) { + if (i == TSDB_DATA_TYPE_NCHAR || i == TSDB_DATA_TYPE_JSON_NCHAR) { /* * for nchar, the TOKENTYPE is the number of character, so the length is the * number of bytes in UCS-4 format, which is 4 times larger than the number of characters @@ -733,7 +745,7 @@ void tSetColumnType(TAOS_FIELD *pField, SStrToken *type) { } pField->bytes = (int16_t)bytes; } - } else if (i == TSDB_DATA_TYPE_BINARY || (i == TSDB_DATA_TYPE_JSON && JSON_TYPE_BINARY)) { + } else if (i == TSDB_DATA_TYPE_BINARY || i == TSDB_DATA_TYPE_JSON_BINARY) { /* for binary, the TOKENTYPE is the length of binary */ if (type->type == 0) { pField->bytes = 0; diff --git a/src/tsdb/src/tsdbMeta.c b/src/tsdb/src/tsdbMeta.c index 321412e49cd15f49fd7b5c39b2d61f477124ce66..e75b118e29339f5f90f1bcd177b29ee91260c402 100644 --- a/src/tsdb/src/tsdbMeta.c +++ b/src/tsdb/src/tsdbMeta.c @@ -211,7 +211,7 @@ void *tsdbGetTableTagVal(const void* pTable, int32_t colId, int16_t type, int16_ } char *val = NULL; - if (pCol->type == TSDB_DATA_TYPE_JSON){ + if (IS_JSON_DATA_TYPE(pCol->type)){ val = ((STable*)pTable)->tagVal; }else{ val = tdGetKVRowValOfCol(((STable*)pTable)->tagVal, colId); @@ -394,7 +394,7 @@ int tsdbUpdateTableTagValue(STsdbRepo *repo, SUpdateTableTagValMsg *pMsg) { } bool isChangeIndexCol = (pMsg->colId == colColId(schemaColAt(pTable->pSuper->tagSchema, 0))) - || pMsg->type == TSDB_DATA_TYPE_JSON; + || IS_JSON_DATA_TYPE(pMsg->type); // STColumn *pCol = bsearch(&(pMsg->colId), pMsg->data, pMsg->numOfTags, sizeof(STColumn), colIdCompar); // ASSERT(pCol != NULL); @@ -403,7 +403,7 @@ int tsdbUpdateTableTagValue(STsdbRepo *repo, SUpdateTableTagValMsg *pMsg) { tsdbRemoveTableFromIndex(pMeta, pTable); } TSDB_WLOCK_TABLE(pTable); - if (pMsg->type == TSDB_DATA_TYPE_JSON){ + if (IS_JSON_DATA_TYPE(pMsg->type)){ kvRowFree(pTable->tagVal); pTable->tagVal = tdKVRowDup(POINTER_SHIFT(pMsg->data, pMsg->schemaLen)); }else{ @@ -857,7 +857,7 @@ static STable *tsdbCreateTableFromCfg(STableCfg *pCfg, bool isSuper, STable *pST } pTable->tagVal = NULL; STColumn *pCol = schemaColAt(pTable->tagSchema, DEFAULT_TAG_INDEX_COLUMN); - if(pCol->type == TSDB_DATA_TYPE_JSON){ + if(IS_JSON_DATA_TYPE(pCol->type)){ assert(pTable->tagSchema->numOfCols == 1); pTable->jsonKeyMap = taosHashInit(8, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK); if (pTable->jsonKeyMap == NULL) { @@ -1096,7 +1096,7 @@ static int tsdbAddTableIntoIndex(STsdbMeta *pMeta, STable *pTable, bool refSuper pTable->pSuper = pSTable; - if(pSTable->tagSchema->columns[0].type == TSDB_DATA_TYPE_JSON){ + if(IS_JSON_DATA_TYPE(pSTable->tagSchema->columns[0].type)){ ASSERT(pSTable->tagSchema->numOfCols == 1); int16_t nCols = kvRowNCols(pTable->tagVal); ASSERT(nCols%2 == 1); @@ -1167,7 +1167,7 @@ static int tsdbRemoveTableFromIndex(STsdbMeta *pMeta, STable *pTable) { STable *pSTable = pTable->pSuper; ASSERT(pSTable != NULL); - if(pSTable->tagSchema->columns[0].type == TSDB_DATA_TYPE_JSON){ + if(IS_JSON_DATA_TYPE(pSTable->tagSchema->columns[0].type)){ ASSERT(pSTable->tagSchema->numOfCols == 1); int16_t nCols = kvRowNCols(pTable->tagVal); ASSERT(nCols%2 == 1); @@ -1450,7 +1450,7 @@ static void *tsdbDecodeTable(void *buf, STable **pRTable) { if (TABLE_TYPE(pTable) == TSDB_SUPER_TABLE) { buf = tdDecodeSchema(buf, &(pTable->tagSchema)); STColumn *pCol = schemaColAt(pTable->tagSchema, DEFAULT_TAG_INDEX_COLUMN); - if(pCol->type == TSDB_DATA_TYPE_JSON){ + if(IS_JSON_DATA_TYPE(pCol->type)){ assert(pTable->tagSchema->numOfCols == 1); pTable->jsonKeyMap = taosHashInit(8, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK); if (pTable->jsonKeyMap == NULL) { diff --git a/src/tsdb/src/tsdbRead.c b/src/tsdb/src/tsdbRead.c index 80b2bc52daf09bf482c9f5d5eb20bd5484e232e3..8500d33cf150d0494db176b1bf693dc84cf13887 100644 --- a/src/tsdb/src/tsdbRead.c +++ b/src/tsdb/src/tsdbRead.c @@ -2678,7 +2678,7 @@ static int tsdbReadRowsFromCache(STableCheckInfo* pCheckInfo, TSKEY maxKey, int static int32_t getAllTableList(STable* pSuperTable, SArray* list) { STSchema* pTagSchema = tsdbGetTableTagSchema(pSuperTable); - if(pTagSchema->numOfCols == 1 && pTagSchema->columns[0].type == TSDB_DATA_TYPE_JSON){ + if(pTagSchema->numOfCols == 1 && IS_JSON_DATA_TYPE(pTagSchema->columns[0].type)){ SArray** pRecord = taosHashIterate(pSuperTable->jsonKeyMap, NULL); SArray* tablist = taosArrayInit(32, sizeof(JsonMapValue)); @@ -3662,7 +3662,7 @@ SArray* createTableGroup(SArray* pTableList, STSchema* pTagSchema, SColIndex* pC // //int32_t dealWithTree(STable* pTable, tExprNode* expr){ // STSchema* pTagSchema = tsdbGetTableTagSchema(pTable); -// if(pTagSchema->columns->type != TSDB_DATA_TYPE_JSON){ +// if(!IS_JSON_DATA_TYPE(pTagSchema->columns->type)){ // return TSDB_CODE_SUCCESS; // } // @@ -4081,7 +4081,7 @@ static FORCE_INLINE int32_t tsdbGetJsonTagDataFromId(void *param, int32_t id, ch if (id == TSDB_TBNAME_COLUMN_INDEX) { *data = TABLE_NAME(pTable); } else { - void* jsonData = getJsonTagValue(pTable, name, strlen(name)); + void* jsonData = getJsonTagValue(pTable, name, strlen(name), pTable->tagSchema->columns->type); if (jsonData != NULL) jsonData += CHAR_BYTES; // jump type *data = jsonData; } @@ -4110,7 +4110,7 @@ static void queryByJsonTag(STable* pTable, void* filterInfo, SArray* res){ SSchema* sch = fi->desc; int32_t outLen = 0; char* key = NULL; - if(JSON_TYPE_NCHAR){ + if(pTable->tagSchema->columns->type == TSDB_DATA_TYPE_JSON_NCHAR){ char tagKey[256] = {0}; if (!taosMbsToUcs4(sch->name, strlen(sch->name), tagKey, 256, &outLen)) { tsdbError("json key to ucs4 error:%s|%s", strerror(errno), sch->name); @@ -4165,7 +4165,7 @@ static void queryByJsonTag(STable* pTable, void* filterInfo, SArray* res){ static int32_t tsdbQueryTableList(STable* pTable, SArray* pRes, void* filterInfo) { STSchema* pTSSchema = pTable->tagSchema; - if(pTSSchema->columns->type == TSDB_DATA_TYPE_JSON){ + if(IS_JSON_DATA_TYPE(pTSSchema->columns->type)){ queryByJsonTag(pTable, filterInfo, pRes); }else{ bool indexQuery = false;