[td-13039] fix null value retrieval.
This commit is contained in:
parent
fa29596935
commit
21aaecd016
|
@ -403,18 +403,12 @@ static STsdbReadHandle* tsdbQueryTablesImpl(STsdb* tsdb, STsdbQueryCond* pCond,
|
||||||
SColumnInfoData colInfo = {{0}, 0};
|
SColumnInfoData colInfo = {{0}, 0};
|
||||||
colInfo.info = pCond->colList[i];
|
colInfo.info = pCond->colList[i];
|
||||||
|
|
||||||
colInfo.pData = calloc(1, EXTRA_BYTES + pReadHandle->outputCapacity * pCond->colList[i].bytes);
|
int32_t code = blockDataEnsureColumnCapacity(&colInfo, pReadHandle->outputCapacity);
|
||||||
if (!IS_VAR_DATA_TYPE(colInfo.info.type)) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
colInfo.nullbitmap = calloc(1, BitmapLen(pReadHandle->outputCapacity));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (colInfo.pData == NULL || (colInfo.nullbitmap == NULL && (!IS_VAR_DATA_TYPE(colInfo.info.type)))) {
|
|
||||||
goto _end;
|
goto _end;
|
||||||
}
|
}
|
||||||
|
|
||||||
taosArrayPush(pReadHandle->pColumns, &colInfo);
|
taosArrayPush(pReadHandle->pColumns, &colInfo);
|
||||||
|
|
||||||
|
|
||||||
pReadHandle->statis[i].colId = colInfo.info.colId;
|
pReadHandle->statis[i].colId = colInfo.info.colId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1418,34 +1412,37 @@ static int32_t doCopyRowsFromFileBlock(STsdbReadHandle* pTsdbReadHandle, int32_t
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isAllRowsNull(src) && pColInfo->info.colId == src->colId) {
|
if (!isAllRowsNull(src) && pColInfo->info.colId == src->colId) {
|
||||||
if (pColInfo->info.type != TSDB_DATA_TYPE_BINARY && pColInfo->info.type != TSDB_DATA_TYPE_NCHAR) {
|
if (!IS_VAR_DATA_TYPE(pColInfo->info.type)) { // todo opt performance
|
||||||
memmove(pData, (char*)src->pData + bytes * start, bytes * num);
|
// memmove(pData, (char*)src->pData + bytes * start, bytes * num);
|
||||||
} else { // handle the var-string
|
for(int32_t k = start; k < num + start; ++k) {
|
||||||
char* dst = pData;
|
SCellVal sVal = {0};
|
||||||
|
if (tdGetColDataOfRow(&sVal, src, k) < 0) {
|
||||||
|
TASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sVal.valType == TD_VTYPE_NULL) {
|
||||||
|
colDataAppend(pColInfo, k, NULL, true);
|
||||||
|
} else {
|
||||||
|
colDataAppend(pColInfo, k, sVal.val, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { // handle the var-string
|
||||||
// todo refactor, only copy one-by-one
|
// todo refactor, only copy one-by-one
|
||||||
for (int32_t k = start; k < num + start; ++k) {
|
for (int32_t k = start; k < num + start; ++k) {
|
||||||
SCellVal sVal = {0};
|
SCellVal sVal = {0};
|
||||||
if(tdGetColDataOfRow(&sVal, src, k) < 0){
|
if(tdGetColDataOfRow(&sVal, src, k) < 0){
|
||||||
TASSERT(0);
|
TASSERT(0);
|
||||||
}
|
}
|
||||||
memcpy(dst, sVal.val, varDataTLen(sVal.val));
|
|
||||||
dst += bytes;
|
colDataAppend(pColInfo, k, sVal.val, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
j++;
|
j++;
|
||||||
i++;
|
i++;
|
||||||
} else { // pColInfo->info.colId < src->colId, it is a NULL data
|
} else { // pColInfo->info.colId < src->colId, it is a NULL data
|
||||||
if (pColInfo->info.type == TSDB_DATA_TYPE_BINARY || pColInfo->info.type == TSDB_DATA_TYPE_NCHAR) {
|
for(int32_t k = start; k < num + start; ++k) { // TODO opt performance
|
||||||
char* dst = pData;
|
colDataAppend(pColInfo, k, NULL, true);
|
||||||
|
|
||||||
for(int32_t k = start; k < num + start; ++k) {
|
|
||||||
setVardataNull(dst, pColInfo->info.type);
|
|
||||||
dst += bytes;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
setNullN(pData, pColInfo->info.type, pColInfo->info.bytes, num);
|
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
@ -1453,23 +1450,9 @@ static int32_t doCopyRowsFromFileBlock(STsdbReadHandle* pTsdbReadHandle, int32_t
|
||||||
|
|
||||||
while (i < requiredNumOfCols) { // the remain columns are all null data
|
while (i < requiredNumOfCols) { // the remain columns are all null data
|
||||||
SColumnInfoData* pColInfo = taosArrayGet(pTsdbReadHandle->pColumns, i);
|
SColumnInfoData* pColInfo = taosArrayGet(pTsdbReadHandle->pColumns, i);
|
||||||
if (ASCENDING_TRAVERSE(pTsdbReadHandle->order)) {
|
for(int32_t k = start; k < num + start; ++k) {
|
||||||
pData = (char*)pColInfo->pData + numOfRows * pColInfo->info.bytes;
|
colDataAppend(pColInfo, k, NULL, true); // TODO add a fast version to set a number of consecutive NULL value.
|
||||||
} else {
|
|
||||||
pData = (char*)pColInfo->pData + (capacity - numOfRows - num) * pColInfo->info.bytes;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pColInfo->info.type == TSDB_DATA_TYPE_BINARY || pColInfo->info.type == TSDB_DATA_TYPE_NCHAR) {
|
|
||||||
char* dst = pData;
|
|
||||||
|
|
||||||
for(int32_t k = start; k < num + start; ++k) {
|
|
||||||
setVardataNull(dst, pColInfo->info.type);
|
|
||||||
dst += pColInfo->info.bytes;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
setNullN(pData, pColInfo->info.type, pColInfo->info.bytes, num);
|
|
||||||
}
|
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue