From 2a8c564083deb142bd6319ef706e67e50a953293 Mon Sep 17 00:00:00 2001 From: wpan Date: Fri, 27 Aug 2021 13:48:43 +0800 Subject: [PATCH] fix nchar duplicated converted issue --- src/client/inc/tsclient.h | 3 ++- src/client/src/tscServer.c | 4 ++-- src/client/src/tscSubquery.c | 4 +++- src/client/src/tscUtil.c | 8 ++++++-- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/client/inc/tsclient.h b/src/client/inc/tsclient.h index 99ed082236..4a017fe50d 100644 --- a/src/client/inc/tsclient.h +++ b/src/client/inc/tsclient.h @@ -307,6 +307,7 @@ typedef struct { char * data; TAOS_ROW tsrow; TAOS_ROW urow; + bool dataConverted; int32_t* length; // length for each field for current row char ** buffer; // Buffer used to put multibytes encoded using unicode (wchar_t) SColumnIndex* pColumnIndex; @@ -439,7 +440,7 @@ int32_t tscTansformFuncForSTableQuery(SQueryInfo *pQueryInfo); void tscRestoreFuncForSTableQuery(SQueryInfo *pQueryInfo); int32_t tscCreateResPointerInfo(SSqlRes *pRes, SQueryInfo *pQueryInfo); -void tscSetResRawPtr(SSqlRes* pRes, SQueryInfo* pQueryInfo); +void tscSetResRawPtr(SSqlRes* pRes, SQueryInfo* pQueryInfo, bool converted); void tscSetResRawPtrRv(SSqlRes* pRes, SQueryInfo* pQueryInfo, SSDataBlock* pBlock, bool convertNchar); void handleDownstreamOperator(SSqlObj** pSqlList, int32_t numOfUpstream, SQueryInfo* px, SSqlObj* pParent); diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index 97b7fb0a5a..ffdeb23cb9 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -1892,7 +1892,7 @@ static int tscLocalResultCommonBuilder(SSqlObj *pSql, int32_t numOfRes) { return pRes->code; } - tscSetResRawPtr(pRes, pQueryInfo); + tscSetResRawPtr(pRes, pQueryInfo, pRes->dataConverted); } else { tscResetForNextRetrieve(pRes); } @@ -2807,7 +2807,7 @@ int tscProcessRetrieveRspFromNode(SSqlObj *pSql) { (tscNonOrderedProjectionQueryOnSTable(pQueryInfo, 0) && !TSDB_QUERY_HAS_TYPE(pQueryInfo->type, TSDB_QUERY_TYPE_JOIN_QUERY) && !TSDB_QUERY_HAS_TYPE(pQueryInfo->type, TSDB_QUERY_TYPE_JOIN_SEC_STAGE))) { - tscSetResRawPtr(pRes, pQueryInfo); + tscSetResRawPtr(pRes, pQueryInfo, pRes->dataConverted); } if (pSql->pSubscription != NULL) { diff --git a/src/client/src/tscSubquery.c b/src/client/src/tscSubquery.c index ca55bce82a..92f6d6c923 100644 --- a/src/client/src/tscSubquery.c +++ b/src/client/src/tscSubquery.c @@ -3448,6 +3448,8 @@ static void doBuildResFromSubqueries(SSqlObj* pSql) { char* pData = getResultBlockPosition(pCmd1, pRes1, pIndex->columnIndex, &bytes); memcpy(data, pData, bytes * numOfRes); + pRes->dataConverted = pRes1->dataConverted; + data += bytes * numOfRes; } @@ -3473,7 +3475,7 @@ static void doBuildResFromSubqueries(SSqlObj* pSql) { doArithmeticCalculate(pQueryInfo, pFilePage, rowSize, finalRowSize); pRes->data = pFilePage->data; - tscSetResRawPtr(pRes, pQueryInfo); + tscSetResRawPtr(pRes, pQueryInfo, pRes->dataConverted); } void tscBuildResFromSubqueries(SSqlObj *pSql) { diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c index 5b919f2473..99bb13970a 100644 --- a/src/client/src/tscUtil.c +++ b/src/client/src/tscUtil.c @@ -690,9 +690,13 @@ static void setResRawPtrImpl(SSqlRes* pRes, SInternalField* pInfo, int32_t i, bo memcpy(pRes->urow[i], pRes->buffer[i], pInfo->field.bytes * pRes->numOfRows); } + + if (convertNchar) { + pRes->dataConverted = true; + } } -void tscSetResRawPtr(SSqlRes* pRes, SQueryInfo* pQueryInfo) { +void tscSetResRawPtr(SSqlRes* pRes, SQueryInfo* pQueryInfo, bool converted) { assert(pRes->numOfCols > 0); if (pRes->numOfRows == 0) { return; @@ -705,7 +709,7 @@ void tscSetResRawPtr(SSqlRes* pRes, SQueryInfo* pQueryInfo) { pRes->length[i] = pInfo->field.bytes; offset += pInfo->field.bytes; - setResRawPtrImpl(pRes, pInfo, i, true); + setResRawPtrImpl(pRes, pInfo, i, converted ? false : true); } } -- GitLab