From 331f2a1f823848abd68fa83f835a507cab7d9268 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Fri, 19 Nov 2021 18:37:50 +0800 Subject: [PATCH] change json output format --- src/client/src/tscSubquery.c | 11 ++++++++-- src/client/src/tscUtil.c | 36 ++++++++------------------------- src/kit/shell/src/shellEngine.c | 33 +++++++++++++++++++++++------- 3 files changed, 43 insertions(+), 37 deletions(-) diff --git a/src/client/src/tscSubquery.c b/src/client/src/tscSubquery.c index 567564e182..d2fe789982 100644 --- a/src/client/src/tscSubquery.c +++ b/src/client/src/tscSubquery.c @@ -2494,7 +2494,7 @@ int32_t tscHandleFirstRoundStableQuery(SSqlObj *pSql) { SExprInfo* p = tscAddFuncInSelectClause(pNewQueryInfo, index++, TSDB_FUNC_TAG, &colIndex, schema, TSDB_COL_TAG, getNewResColId(pCmd)); if (schema->type == TSDB_DATA_TYPE_JSON){ p->base.numOfParams = pExpr->base.numOfParams; - p->base.param[0] = pExpr->base.param[0]; + tVariantAssign(&p->base.param[0], &pExpr->base.param[0]); } p->base.resColId = pExpr->base.resColId; } else if (pExpr->base.functionId == TSDB_FUNC_PRJ) { @@ -3687,7 +3687,14 @@ TAOS_ROW doSetResultRowData(SSqlObj *pSql) { int32_t type = pInfo->field.type; int32_t bytes = pInfo->field.bytes; - if (!IS_VAR_DATA_TYPE(type) && type != TSDB_DATA_TYPE_JSON) { + if (type == TSDB_DATA_TYPE_JSON){ + char* p = pRes->urow[i]; + if (*p == TSDB_DATA_TYPE_NCHAR && isNull(POINTER_SHIFT(p, CHAR_BYTES), type)) { + pRes->tsrow[j] = NULL; + }else{ + pRes->tsrow[j] = pRes->urow[i]; + } + }else if (!IS_VAR_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 d0dc085351..18a4018fa2 100644 --- a/src/client/src/tscUtil.c +++ b/src/client/src/tscUtil.c @@ -750,7 +750,7 @@ static void setResRawPtrImpl(SSqlRes* pRes, SInternalField* pInfo, int32_t i, bo p += pInfo->field.bytes; } memcpy(pRes->urow[i], pRes->buffer[i], pInfo->field.bytes * pRes->numOfRows); - }else if (pInfo->field.type == TSDB_DATA_TYPE_JSON) { + }else if (convertNchar && pInfo->field.type == TSDB_DATA_TYPE_JSON && *(char*)(pRes->urow[i]) == TSDB_DATA_TYPE_NCHAR) { // 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) return; @@ -761,34 +761,14 @@ static void setResRawPtrImpl(SSqlRes* pRes, SInternalField* pInfo, int32_t i, bo char* p = pRes->urow[i]; for (int32_t k = 0; k < pRes->numOfRows; ++k) { char* dst = pRes->buffer[i] + k * pInfo->field.bytes; - char type = *p; char* realData = p + CHAR_BYTES; - if (type == TSDB_DATA_TYPE_NCHAR && isNull(realData, TSDB_DATA_TYPE_NCHAR)) { - memcpy(dst, realData, varDataTLen(realData)); - } else if (type == TSDB_DATA_TYPE_BINARY) { - assert(*(uint32_t*)varDataVal(realData) == TSDB_DATA_JSON_null); // json null value - assert(varDataLen(realData) == INT_BYTES); - sprintf(varDataVal(dst), "%s", "null"); - varDataSetLen(dst, strlen(varDataVal(dst))); - }else if (type == TSDB_DATA_TYPE_NCHAR) { - int32_t length = taosUcs4ToMbs(varDataVal(realData), varDataLen(realData), varDataVal(dst)); - varDataSetLen(dst, length); - if (length == 0) { - tscError("charset:%s to %s. val:%s convert failed.", DEFAULT_UNICODE_ENCODEC, tsCharset, (char*)p); - } - }else if (type == TSDB_DATA_TYPE_DOUBLE) { - double jsonVd = *(double*)(realData); - sprintf(varDataVal(dst), "%.9lf", jsonVd); - varDataSetLen(dst, strlen(varDataVal(dst))); - }else if (type == TSDB_DATA_TYPE_BIGINT) { - int64_t jsonVd = *(int64_t*)(realData); - sprintf(varDataVal(dst), "%" PRId64, jsonVd); - varDataSetLen(dst, strlen(varDataVal(dst))); - }else if (type == TSDB_DATA_TYPE_BOOL) { - sprintf(varDataVal(dst), "%s", (*((char *)realData) == 1) ? "true" : "false"); - varDataSetLen(dst, strlen(varDataVal(dst))); - }else { - assert(0); + + *dst = *p; + dst += CHAR_BYTES; + int32_t length = taosUcs4ToMbs(varDataVal(realData), varDataLen(realData), varDataVal(dst)); + varDataSetLen(dst, length); + if (length == 0) { + tscError("charset:%s to %s. val:%s convert failed.", DEFAULT_UNICODE_ENCODEC, tsCharset, (char*)p); } p += pInfo->field.bytes; diff --git a/src/kit/shell/src/shellEngine.c b/src/kit/shell/src/shellEngine.c index a6cc5a76cb..d496776954 100644 --- a/src/kit/shell/src/shellEngine.c +++ b/src/kit/shell/src/shellEngine.c @@ -470,12 +470,22 @@ static char* formatTimestamp(char* buf, int64_t val, int precision) { } -static void dumpFieldToFile(FILE* fp, const char* val, TAOS_FIELD* field, int32_t length, int precision) { +static void dumpFieldToFile(FILE* fp, char* val, TAOS_FIELD* field, int32_t length, int precision) { if (val == NULL) { fprintf(fp, "%s", TSDB_DATA_NULL_STR); return; } + uint8_t type = field->type; + if (type == TSDB_DATA_TYPE_JSON){ + char* p = val; + type = *p; + val += CHAR_BYTES; + if(type == TSDB_DATA_TYPE_NCHAR) { + length = varDataLen(val); + } + } + char buf[TSDB_MAX_BYTES_PER_ROW]; switch (field->type) { case TSDB_DATA_TYPE_BOOL: @@ -556,7 +566,7 @@ static int dumpResultToFile(const char* fname, TAOS_RES* tres) { if (i > 0) { fputc(',', fp); } - dumpFieldToFile(fp, (const char*)row[i], fields +i, length[i], precision); + dumpFieldToFile(fp, row[i], fields +i, length[i], precision); } fputc('\n', fp); @@ -635,7 +645,7 @@ static void shellPrintNChar(const char *str, int length, int width) { } -static void printField(const char* val, TAOS_FIELD* field, int width, int32_t length, int precision) { +static void printField(char* val, TAOS_FIELD* field, int width, int32_t length, int precision) { if (val == NULL) { int w = width; if (field->type < TSDB_DATA_TYPE_TINYINT || field->type > TSDB_DATA_TYPE_DOUBLE) { @@ -648,8 +658,18 @@ static void printField(const char* val, TAOS_FIELD* field, int width, int32_t le return; } + uint8_t type = field->type; + if (type == TSDB_DATA_TYPE_JSON){ + char* p = val; + type = *p; + val += CHAR_BYTES; + if(type == TSDB_DATA_TYPE_NCHAR) { + length = varDataLen(val); + } + } + char buf[TSDB_MAX_BYTES_PER_ROW]; - switch (field->type) { + switch (type) { case TSDB_DATA_TYPE_BOOL: printf("%*s", width, ((((int32_t)(*((char *)val))) == 1) ? "true" : "false")); break; @@ -685,7 +705,6 @@ 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: shellPrintNChar(val, length, width); break; case TSDB_DATA_TYPE_TIMESTAMP: @@ -747,7 +766,7 @@ static int verticalPrintResult(TAOS_RES* tres) { int padding = (int)(maxColNameLen - strlen(field->name)); printf("%*.s%s: ", padding, " ", field->name); - printField((const char*)row[i], field, 0, length[i], precision); + printField(row[i], field, 0, length[i], precision); putchar('\n'); } } else if (showMore) { @@ -877,7 +896,7 @@ static int horizontalPrintResult(TAOS_RES* tres) { if (numOfRows < resShowMaxNum) { for (int i = 0; i < num_fields; i++) { putchar(' '); - printField((const char*)row[i], fields + i, width[i], length[i], precision); + printField(row[i], fields + i, width[i], length[i], precision); putchar(' '); putchar('|'); } -- GitLab