Merge pull request #11492 from taosdata/fix/TD-14732
fix(query): taosd crash when concat has NULL inputs
This commit is contained in:
commit
b6ec83d3c2
|
@ -331,6 +331,19 @@ static int32_t concatCopyHelper(const char *input, char *output, bool hasNcharCo
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t getNumOfNullEntries(SColumnInfoData *pColumnInfoData, int32_t numOfRows) {
|
||||||
|
int32_t numOfNulls = 0;
|
||||||
|
if (!pColumnInfoData->hasNull) {
|
||||||
|
return numOfNulls;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < numOfRows; ++i) {
|
||||||
|
if (pColumnInfoData->varmeta.offset[i] == -1) {
|
||||||
|
numOfNulls++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return numOfNulls;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t concatFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
|
int32_t concatFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
|
||||||
if (inputNum < 2 || inputNum > 8) { // concat accpet 2-8 input strings
|
if (inputNum < 2 || inputNum > 8) { // concat accpet 2-8 input strings
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
|
@ -363,10 +376,12 @@ int32_t concatFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOu
|
||||||
if (hasNcharCol && (GET_PARAM_TYPE(&pInput[i]) == TSDB_DATA_TYPE_VARCHAR)) {
|
if (hasNcharCol && (GET_PARAM_TYPE(&pInput[i]) == TSDB_DATA_TYPE_VARCHAR)) {
|
||||||
factor = TSDB_NCHAR_SIZE;
|
factor = TSDB_NCHAR_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t numOfNulls = getNumOfNullEntries(pInputData[i], pInput[i].numOfRows);
|
||||||
if (pInput[i].numOfRows == 1) {
|
if (pInput[i].numOfRows == 1) {
|
||||||
inputLen += (pInputData[i]->varmeta.length - VARSTR_HEADER_SIZE) * factor * numOfRows;
|
inputLen += (pInputData[i]->varmeta.length - VARSTR_HEADER_SIZE) * factor * (numOfRows - numOfNulls);
|
||||||
} else {
|
} else {
|
||||||
inputLen += pInputData[i]->varmeta.length - numOfRows * VARSTR_HEADER_SIZE;
|
inputLen += pInputData[i]->varmeta.length - (numOfRows - numOfNulls) * VARSTR_HEADER_SIZE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -444,13 +459,15 @@ int32_t concatWsFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *p
|
||||||
if (hasNcharCol && (GET_PARAM_TYPE(&pInput[i]) == TSDB_DATA_TYPE_VARCHAR)) {
|
if (hasNcharCol && (GET_PARAM_TYPE(&pInput[i]) == TSDB_DATA_TYPE_VARCHAR)) {
|
||||||
factor = TSDB_NCHAR_SIZE;
|
factor = TSDB_NCHAR_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t numOfNulls = getNumOfNullEntries(pInputData[i], pInput[i].numOfRows);
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
// calculate required separator space
|
// calculate required separator space
|
||||||
inputLen += (pInputData[0]->varmeta.length - VARSTR_HEADER_SIZE) * numOfRows * (inputNum - 2) * factor;
|
inputLen += (pInputData[0]->varmeta.length - VARSTR_HEADER_SIZE) * (numOfRows - numOfNulls) * (inputNum - 2) * factor;
|
||||||
} else if (pInput[i].numOfRows == 1) {
|
} else if (pInput[i].numOfRows == 1) {
|
||||||
inputLen += (pInputData[i]->varmeta.length - VARSTR_HEADER_SIZE) * numOfRows * factor;
|
inputLen += (pInputData[i]->varmeta.length - VARSTR_HEADER_SIZE) * (numOfRows - numOfNulls) * factor;
|
||||||
} else {
|
} else {
|
||||||
inputLen += pInputData[i]->varmeta.length - numOfRows * VARSTR_HEADER_SIZE;
|
inputLen += pInputData[i]->varmeta.length - (numOfRows - numOfNulls) * VARSTR_HEADER_SIZE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -266,20 +266,21 @@ if $data11 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
# print ====> select c2, c3 , concat(c2,c3) from ctb6
|
print ====> select c2, c3 , concat(c2,c3) from ctb6
|
||||||
# sql select c2, c3 , concat(c2,c3) from ctb6
|
sql select c2, c3 , concat(c2,c3) from ctb6
|
||||||
# print ====> rows: $rows
|
print ====> rows: $rows
|
||||||
# print ====> $data00 $data01 $data02
|
print ====> $data00 $data01 $data02
|
||||||
# print ====> $data10 $data11 $data12
|
print ====> $data10 $data11 $data12
|
||||||
# if $rows != 2 then
|
if $rows != 2 then
|
||||||
# return -1
|
return -1
|
||||||
# endi
|
endi
|
||||||
# if $data02 != 中文测试01中文测试01 then
|
if $data02 != 中文测试1中文测试2 then
|
||||||
# return -1
|
return -1
|
||||||
# endi
|
endi
|
||||||
# if $data12 != NULL then
|
if $data12 != NULL then
|
||||||
# return -1
|
return -1
|
||||||
# endi
|
endi
|
||||||
|
return
|
||||||
|
|
||||||
print ====> select c2, c3 , concat(c2,c3) from ntb6
|
print ====> select c2, c3 , concat(c2,c3) from ntb6
|
||||||
sql select c2, c3 , concat(c2,c3) from ntb6
|
sql select c2, c3 , concat(c2,c3) from ntb6
|
||||||
|
|
Loading…
Reference in New Issue