fix:[TD-31468] Fix char function wrong result.

This commit is contained in:
sima 2024-08-15 11:27:59 +08:00
parent 06af850e3c
commit ebe5f183cb
1 changed files with 15 additions and 5 deletions

View File

@ -1295,30 +1295,40 @@ int32_t charFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp
int32_t outputLen = inputNum * 4 + 2; int32_t outputLen = inputNum * 4 + 2;
char *outputBuf = taosMemoryCalloc(outputLen, 1); char *outputBuf = taosMemoryCalloc(outputLen, 1);
if (outputBuf == NULL) { if (outputBuf == NULL) {
SCL_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); SCL_ERR_RET(terrno);
} }
for (int32_t i = 0; i < pInput[0].numOfRows; ++i) { int32_t numOfRows = 0;
for (int32_t i = 0; i < inputNum; ++i) {
numOfRows = TMAX(numOfRows, pInput[i].numOfRows);
}
for (int32_t i = 0; i < numOfRows; ++i) {
char *output = varDataVal(outputBuf); char *output = varDataVal(outputBuf);
for (int32_t j = 0; j < inputNum; ++j) { for (int32_t j = 0; j < inputNum; ++j) {
int32_t colIdx = (pInput[j].numOfRows == 1) ? 0 : i;
int32_t num; int32_t num;
if (colDataIsNull_s(pInput[j].columnData, i)) { if (colDataIsNull_s(pInput[j].columnData, i)) {
continue; continue;
} else if (IS_NUMERIC_TYPE(GET_PARAM_TYPE(&pInput[j]))) { } else if (IS_NUMERIC_TYPE(GET_PARAM_TYPE(&pInput[j]))) {
GET_TYPED_DATA(num, int32_t, GET_PARAM_TYPE(&pInput[j]), pInput[j].columnData->pData); GET_TYPED_DATA(num, int32_t, GET_PARAM_TYPE(&pInput[j]), colDataGetData(pInput[j].columnData, colIdx));
getAsciiChar(num, &output); getAsciiChar(num, &output);
} else if (TSDB_DATA_TYPE_BINARY == GET_PARAM_TYPE(&pInput[j])) { } else if (TSDB_DATA_TYPE_BINARY == GET_PARAM_TYPE(&pInput[j])) {
num = taosStr2Int32(varDataVal(pInput[j].columnData->pData), NULL, 10); num = taosStr2Int32(varDataVal(colDataGetData(pInput[j].columnData, colIdx)), NULL, 10);
getAsciiChar(num, &output); getAsciiChar(num, &output);
} else if (TSDB_DATA_TYPE_NCHAR == GET_PARAM_TYPE(&pInput[j])) { } else if (TSDB_DATA_TYPE_NCHAR == GET_PARAM_TYPE(&pInput[j])) {
char *convBuf = taosMemoryMalloc(GET_PARAM_BYTES(&pInput[j])); char *convBuf = taosMemoryMalloc(GET_PARAM_BYTES(&pInput[j]));
int32_t len = taosUcs4ToMbs((TdUcs4 *)varDataVal(pInput[j].columnData->pData), varDataLen(pInput[j].columnData->pData), convBuf); if (convBuf == NULL) {
SCL_ERR_RET(terrno);
}
int32_t len = taosUcs4ToMbs((TdUcs4 *)varDataVal(colDataGetData(pInput[j].columnData, colIdx)), varDataLen(colDataGetData(pInput[j].columnData, colIdx)), convBuf);
if (len < 0) { if (len < 0) {
taosMemoryFree(convBuf);
code = TSDB_CODE_SCALAR_CONVERT_ERROR; code = TSDB_CODE_SCALAR_CONVERT_ERROR;
goto _return; goto _return;
} }
convBuf[len] = 0; convBuf[len] = 0;
num = taosStr2Int32(convBuf, NULL, 10); num = taosStr2Int32(convBuf, NULL, 10);
getAsciiChar(num, &output); getAsciiChar(num, &output);
taosMemoryFree(convBuf);
} else { } else {
code = TSDB_CODE_FUNC_FUNTION_PARA_TYPE; code = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
goto _return; goto _return;