fea:add select json logic
This commit is contained in:
parent
e818e27902
commit
91dc9e9089
|
@ -232,7 +232,7 @@ typedef enum ELogicConditionType {
|
||||||
#define TSDB_MAX_TAGS 128
|
#define TSDB_MAX_TAGS 128
|
||||||
#define TSDB_MAX_TAG_CONDITIONS 1024
|
#define TSDB_MAX_TAG_CONDITIONS 1024
|
||||||
|
|
||||||
#define TSDB_MAX_JSON_TAG_LEN (16384 + VARSTR_HEADER_SIZE)
|
#define TSDB_MAX_JSON_TAG_LEN 16384
|
||||||
|
|
||||||
#define TSDB_AUTH_LEN 16
|
#define TSDB_AUTH_LEN 16
|
||||||
#define TSDB_PASSWORD_LEN 32
|
#define TSDB_PASSWORD_LEN 32
|
||||||
|
|
|
@ -23,6 +23,8 @@
|
||||||
#include "tmsgtype.h"
|
#include "tmsgtype.h"
|
||||||
#include "tpagedbuf.h"
|
#include "tpagedbuf.h"
|
||||||
#include "tref.h"
|
#include "tref.h"
|
||||||
|
#include "cJSON.h"
|
||||||
|
#include "tdataformat.h"
|
||||||
|
|
||||||
static int32_t initEpSetFromCfg(const char* firstEp, const char* secondEp, SCorEpSet* pEpSet);
|
static int32_t initEpSetFromCfg(const char* firstEp, const char* secondEp, SCorEpSet* pEpSet);
|
||||||
static SMsgSendInfo* buildConnectMsg(SRequestObj* pRequest);
|
static SMsgSendInfo* buildConnectMsg(SRequestObj* pRequest);
|
||||||
|
@ -745,7 +747,6 @@ static int32_t doPrepareResPtr(SReqResultInfo* pResInfo) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "cJSON.h"
|
|
||||||
static char* parseTagDatatoJson(void *p){
|
static char* parseTagDatatoJson(void *p){
|
||||||
char* string = NULL;
|
char* string = NULL;
|
||||||
cJSON *json = cJSON_CreateObject();
|
cJSON *json = cJSON_CreateObject();
|
||||||
|
@ -815,14 +816,14 @@ static char* parseTagDatatoJson(void *p){
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
cJSON_AddItemToObject(json, tagJsonKey, value);
|
cJSON_AddItemToObject(json, tagJsonKey, value);
|
||||||
}else if(type == TSDB_DATA_TYPE_BIGINT){
|
// }else if(type == TSDB_DATA_TYPE_BIGINT){
|
||||||
int64_t jsonVd = *(int64_t*)(realData);
|
// int64_t jsonVd = *(int64_t*)(realData);
|
||||||
cJSON* value = cJSON_CreateNumber((double)jsonVd);
|
// cJSON* value = cJSON_CreateNumber((double)jsonVd);
|
||||||
if (value == NULL)
|
// if (value == NULL)
|
||||||
{
|
// {
|
||||||
goto end;
|
// goto end;
|
||||||
}
|
// }
|
||||||
cJSON_AddItemToObject(json, tagJsonKey, value);
|
// cJSON_AddItemToObject(json, tagJsonKey, value);
|
||||||
}else if (type == TSDB_DATA_TYPE_BOOL) {
|
}else if (type == TSDB_DATA_TYPE_BOOL) {
|
||||||
char jsonVd = *(char*)(realData);
|
char jsonVd = *(char*)(realData);
|
||||||
cJSON* value = cJSON_CreateBool(jsonVd);
|
cJSON* value = cJSON_CreateBool(jsonVd);
|
||||||
|
@ -833,7 +834,7 @@ static char* parseTagDatatoJson(void *p){
|
||||||
cJSON_AddItemToObject(json, tagJsonKey, value);
|
cJSON_AddItemToObject(json, tagJsonKey, value);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
tscError("unsupportted json value");
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -842,7 +843,6 @@ end:
|
||||||
cJSON_Delete(json);
|
cJSON_Delete(json);
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
#include "tdataformat.h"
|
|
||||||
|
|
||||||
static int32_t doConvertUCS4(SReqResultInfo* pResultInfo, int32_t numOfRows, int32_t numOfCols, int32_t* colLength) {
|
static int32_t doConvertUCS4(SReqResultInfo* pResultInfo, int32_t numOfRows, int32_t numOfCols, int32_t* colLength) {
|
||||||
for (int32_t i = 0; i < numOfCols; ++i) {
|
for (int32_t i = 0; i < numOfCols; ++i) {
|
||||||
|
@ -886,51 +886,43 @@ static int32_t doConvertUCS4(SReqResultInfo* pResultInfo, int32_t numOfRows, int
|
||||||
for (int32_t j = 0; j < numOfRows; ++j) {
|
for (int32_t j = 0; j < numOfRows; ++j) {
|
||||||
if (pCol->offset[j] != -1) {
|
if (pCol->offset[j] != -1) {
|
||||||
char* pStart = pCol->offset[j] + pCol->pData;
|
char* pStart = pCol->offset[j] + pCol->pData;
|
||||||
|
|
||||||
|
|
||||||
|
int32_t jsonInnerType = *pStart;
|
||||||
|
char* jsonInnerData = pStart + CHAR_BYTES;
|
||||||
char dst[TSDB_MAX_JSON_TAG_LEN] = {0};
|
char dst[TSDB_MAX_JSON_TAG_LEN] = {0};
|
||||||
char *jsonString = parseTagDatatoJson(pStart);
|
if (jsonInnerType == TSDB_DATA_TYPE_NULL) {
|
||||||
|
sprintf(varDataVal(dst), "%s", TSDB_DATA_NULL_STR_L);
|
||||||
|
varDataSetLen(dst, strlen(varDataVal(dst)));
|
||||||
|
} else if (jsonInnerType == TSDB_DATA_TYPE_JSON) {
|
||||||
|
char *jsonString = parseTagDatatoJson(jsonInnerData);
|
||||||
STR_TO_VARSTR(dst, jsonString);
|
STR_TO_VARSTR(dst, jsonString);
|
||||||
taosMemoryFree(jsonString);
|
taosMemoryFree(jsonString);
|
||||||
// int32_t jsonInnerType = *pStart;
|
} else if (jsonInnerType == TSDB_DATA_TYPE_NCHAR) { // value -> "value"
|
||||||
// char* jsonInnerData = pStart + CHAR_BYTES;
|
*(char*)varDataVal(dst) = '\"';
|
||||||
// char dst[TSDB_MAX_JSON_TAG_LEN] = {0};
|
int32_t length = taosUcs4ToMbs((TdUcs4*)varDataVal(jsonInnerData), varDataLen(jsonInnerData),
|
||||||
// if (jsonInnerType == TSDB_DATA_TYPE_NULL) {
|
varDataVal(dst) + CHAR_BYTES);
|
||||||
// sprintf(varDataVal(dst), "%s", TSDB_DATA_NULL_STR_L);
|
if (length <= 0) {
|
||||||
// varDataSetLen(dst, strlen(varDataVal(dst)));
|
tscError("charset:%s to %s. val:%s convert failed.", DEFAULT_UNICODE_ENCODEC, tsCharset,
|
||||||
// } else if (jsonInnerType == TSDB_DATA_TYPE_JSON) {
|
varDataVal(jsonInnerData));
|
||||||
// int32_t length =
|
length = 0;
|
||||||
// taosUcs4ToMbs((TdUcs4*)varDataVal(jsonInnerData), varDataLen(jsonInnerData), varDataVal(dst));
|
}
|
||||||
//
|
varDataSetLen(dst, length + CHAR_BYTES * 2);
|
||||||
// if (length <= 0) {
|
*(char*)(varDataVal(dst), length + CHAR_BYTES) = '\"';
|
||||||
// tscError("charset:%s to %s. val:%s convert failed.", DEFAULT_UNICODE_ENCODEC, tsCharset,
|
} else if (jsonInnerType == TSDB_DATA_TYPE_DOUBLE) {
|
||||||
// varDataVal(jsonInnerData));
|
double jsonVd = *(double*)(jsonInnerData);
|
||||||
// length = 0;
|
sprintf(varDataVal(dst), "%.9lf", jsonVd);
|
||||||
// }
|
varDataSetLen(dst, strlen(varDataVal(dst)));
|
||||||
// varDataSetLen(dst, length);
|
} else if (jsonInnerType == TSDB_DATA_TYPE_BIGINT) {
|
||||||
// } else if (jsonInnerType == TSDB_DATA_TYPE_NCHAR) { // value -> "value"
|
int64_t jsonVd = *(int64_t*)(jsonInnerData);
|
||||||
// *(char*)varDataVal(dst) = '\"';
|
sprintf(varDataVal(dst), "%" PRId64, jsonVd);
|
||||||
// int32_t length = taosUcs4ToMbs((TdUcs4*)varDataVal(jsonInnerData), varDataLen(jsonInnerData),
|
varDataSetLen(dst, strlen(varDataVal(dst)));
|
||||||
// varDataVal(dst) + CHAR_BYTES);
|
} else if (jsonInnerType == TSDB_DATA_TYPE_BOOL) {
|
||||||
// if (length <= 0) {
|
sprintf(varDataVal(dst), "%s", (*((char*)jsonInnerData) == 1) ? "true" : "false");
|
||||||
// tscError("charset:%s to %s. val:%s convert failed.", DEFAULT_UNICODE_ENCODEC, tsCharset,
|
varDataSetLen(dst, strlen(varDataVal(dst)));
|
||||||
// varDataVal(jsonInnerData));
|
} else {
|
||||||
// length = 0;
|
ASSERT(0);
|
||||||
// }
|
}
|
||||||
// varDataSetLen(dst, length + CHAR_BYTES * 2);
|
|
||||||
// *(char*)(varDataVal(dst), length + CHAR_BYTES) = '\"';
|
|
||||||
// } else if (jsonInnerType == TSDB_DATA_TYPE_DOUBLE) {
|
|
||||||
// double jsonVd = *(double*)(jsonInnerData);
|
|
||||||
// sprintf(varDataVal(dst), "%.9lf", jsonVd);
|
|
||||||
// varDataSetLen(dst, strlen(varDataVal(dst)));
|
|
||||||
// } else if (jsonInnerType == TSDB_DATA_TYPE_BIGINT) {
|
|
||||||
// int64_t jsonVd = *(int64_t*)(jsonInnerData);
|
|
||||||
// sprintf(varDataVal(dst), "%" PRId64, jsonVd);
|
|
||||||
// varDataSetLen(dst, strlen(varDataVal(dst)));
|
|
||||||
// } else if (jsonInnerType == TSDB_DATA_TYPE_BOOL) {
|
|
||||||
// sprintf(varDataVal(dst), "%s", (*((char*)jsonInnerData) == 1) ? "true" : "false");
|
|
||||||
// varDataSetLen(dst, strlen(varDataVal(dst)));
|
|
||||||
// } else {
|
|
||||||
// ASSERT(0);
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (len + varDataTLen(dst) > colLength[i]) {
|
if (len + varDataTLen(dst) > colLength[i]) {
|
||||||
p = taosMemoryRealloc(pResultInfo->convertBuf[i], len + varDataTLen(dst));
|
p = taosMemoryRealloc(pResultInfo->convertBuf[i], len + varDataTLen(dst));
|
||||||
|
|
|
@ -116,21 +116,22 @@ int32_t colDataAppend(SColumnInfoData* pColumnInfoData, uint32_t currentRow, con
|
||||||
|
|
||||||
int32_t type = pColumnInfoData->info.type;
|
int32_t type = pColumnInfoData->info.type;
|
||||||
if (IS_VAR_DATA_TYPE(type)) {
|
if (IS_VAR_DATA_TYPE(type)) {
|
||||||
int32_t dataLen = 0;
|
int32_t dataLen = varDataTLen(pData);
|
||||||
if (type == TSDB_DATA_TYPE_JSON) {
|
if (type == TSDB_DATA_TYPE_JSON) {
|
||||||
// if (*pData == TSDB_DATA_TYPE_NULL) {
|
if (*pData == TSDB_DATA_TYPE_NULL) {
|
||||||
// dataLen = 0;
|
dataLen = 0;
|
||||||
// } else if (*pData == TSDB_DATA_TYPE_NCHAR) {
|
} else if (*pData == TSDB_DATA_TYPE_NCHAR) {
|
||||||
// dataLen = varDataTLen(pData + CHAR_BYTES);
|
dataLen = varDataTLen(pData + CHAR_BYTES);
|
||||||
// } else if (*pData == TSDB_DATA_TYPE_BIGINT || *pData == TSDB_DATA_TYPE_DOUBLE) {
|
} else if (*pData == TSDB_DATA_TYPE_DOUBLE) {
|
||||||
// dataLen = LONG_BYTES;
|
dataLen = DOUBLE_BYTES;
|
||||||
// } else if (*pData == TSDB_DATA_TYPE_BOOL) {
|
} else if (*pData == TSDB_DATA_TYPE_BOOL) {
|
||||||
// dataLen = CHAR_BYTES;
|
dataLen = CHAR_BYTES;
|
||||||
// }
|
} else if (*pData == TSDB_DATA_TYPE_JSON) {
|
||||||
// dataLen += CHAR_BYTES;
|
dataLen = kvRowLen(pData + CHAR_BYTES);
|
||||||
dataLen = kvRowLen(pData);
|
} else {
|
||||||
}else {
|
ASSERT(0);
|
||||||
dataLen = varDataTLen(pData);
|
}
|
||||||
|
dataLen += CHAR_BYTES;
|
||||||
}
|
}
|
||||||
|
|
||||||
SVarColAttr* pAttr = &pColumnInfoData->varmeta;
|
SVarColAttr* pAttr = &pColumnInfoData->varmeta;
|
||||||
|
|
|
@ -1469,7 +1469,15 @@ static SSDataBlock* doTagScan(SOperatorInfo* pOperator) {
|
||||||
} else { // it is a tag value
|
} else { // it is a tag value
|
||||||
const char* p = NULL;
|
const char* p = NULL;
|
||||||
if(pDst->info.type == TSDB_DATA_TYPE_JSON){
|
if(pDst->info.type == TSDB_DATA_TYPE_JSON){
|
||||||
p = mr.me.ctbEntry.pTags;
|
const uint8_t *tmp = mr.me.ctbEntry.pTags;
|
||||||
|
char *data = taosMemoryCalloc(kvRowLen(tmp) + 1, 1);
|
||||||
|
if(data == NULL){
|
||||||
|
qError("doTagScan calloc error:%d", kvRowLen(tmp) + 1);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
*data = TSDB_DATA_TYPE_JSON;
|
||||||
|
memcpy(data+1, tmp, kvRowLen(tmp));
|
||||||
|
p = data;
|
||||||
}else{
|
}else{
|
||||||
p = metaGetTableTagVal(&mr.me, pExprInfo[j].base.pParam[0].pCol->colId);
|
p = metaGetTableTagVal(&mr.me, pExprInfo[j].base.pParam[0].pCol->colId);
|
||||||
}
|
}
|
||||||
|
|
|
@ -356,8 +356,8 @@ int parseJsontoTagData(const char* json, SKVRowBuilder* kvRowBuilder, SMsgBuf* p
|
||||||
if (keyLen == 0 || taosHashGet(keyHash, jsonKey, keyLen) != NULL) {
|
if (keyLen == 0 || taosHashGet(keyHash, jsonKey, keyLen) != NULL) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// key: keyLen + VARSTR_HEADER_SIZE, value type: CHAR_BYTES, value reserved: LONG_BYTES
|
// key: keyLen + VARSTR_HEADER_SIZE, value type: CHAR_BYTES, value reserved: DOUBLE_BYTES
|
||||||
tagKV = taosMemoryCalloc(keyLen + VARSTR_HEADER_SIZE + CHAR_BYTES + LONG_BYTES, 1);
|
tagKV = taosMemoryCalloc(keyLen + VARSTR_HEADER_SIZE + CHAR_BYTES + DOUBLE_BYTES, 1);
|
||||||
if (!tagKV) {
|
if (!tagKV) {
|
||||||
retCode = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
retCode = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -402,13 +402,9 @@ int parseJsontoTagData(const char* json, SKVRowBuilder* kvRowBuilder, SMsgBuf* p
|
||||||
}
|
}
|
||||||
char* valueType = POINTER_SHIFT(tagKV, keyLen + VARSTR_HEADER_SIZE);
|
char* valueType = POINTER_SHIFT(tagKV, keyLen + VARSTR_HEADER_SIZE);
|
||||||
char* valueData = POINTER_SHIFT(tagKV, keyLen + VARSTR_HEADER_SIZE + CHAR_BYTES);
|
char* valueData = POINTER_SHIFT(tagKV, keyLen + VARSTR_HEADER_SIZE + CHAR_BYTES);
|
||||||
*valueType =
|
*valueType = TSDB_DATA_TYPE_DOUBLE;
|
||||||
(item->valuedouble - (int64_t)(item->valuedouble) == 0) ? TSDB_DATA_TYPE_BIGINT : TSDB_DATA_TYPE_DOUBLE;
|
|
||||||
if (*valueType == TSDB_DATA_TYPE_DOUBLE)
|
|
||||||
*((double*)valueData) = item->valuedouble;
|
*((double*)valueData) = item->valuedouble;
|
||||||
else if (*valueType == TSDB_DATA_TYPE_BIGINT)
|
tdAddColToKVRow(kvRowBuilder, jsonIndex++, tagKV, keyLen + VARSTR_HEADER_SIZE + CHAR_BYTES + DOUBLE_BYTES);
|
||||||
*((int64_t*)valueData) = item->valueint;
|
|
||||||
tdAddColToKVRow(kvRowBuilder, jsonIndex++, tagKV, keyLen + VARSTR_HEADER_SIZE + CHAR_BYTES + LONG_BYTES);
|
|
||||||
} else if (item->type == cJSON_True || item->type == cJSON_False) {
|
} else if (item->type == cJSON_True || item->type == cJSON_False) {
|
||||||
char* valueType = POINTER_SHIFT(tagKV, keyLen + VARSTR_HEADER_SIZE);
|
char* valueType = POINTER_SHIFT(tagKV, keyLen + VARSTR_HEADER_SIZE);
|
||||||
char* valueData = POINTER_SHIFT(tagKV, keyLen + VARSTR_HEADER_SIZE + CHAR_BYTES);
|
char* valueData = POINTER_SHIFT(tagKV, keyLen + VARSTR_HEADER_SIZE + CHAR_BYTES);
|
||||||
|
|
|
@ -922,7 +922,7 @@ static void doReleaseVec(SColumnInfoData* pCol, int32_t type) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char *getJsonValue(char *json, char *key){ //todo
|
char *getJsonValue(char *json, char *key){
|
||||||
int16_t cols = kvRowNCols(json);
|
int16_t cols = kvRowNCols(json);
|
||||||
for (int i = 0; i < cols; ++i) {
|
for (int i = 0; i < cols; ++i) {
|
||||||
SColIdx *pColIdx = kvRowColIdxAt(json, i);
|
SColIdx *pColIdx = kvRowColIdxAt(json, i);
|
||||||
|
|
Loading…
Reference in New Issue