diff --git a/include/common/trow.h b/include/common/trow.h index 4031946ee8..c596134fcd 100644 --- a/include/common/trow.h +++ b/include/common/trow.h @@ -299,6 +299,7 @@ int32_t tdAppendColValToRow(SRowBuilder *pBuilder, col_id_t colId, int8_t colTyp int32_t tdGetTpRowValOfCol(SCellVal *output, STSRow *pRow, void *pBitmap, int8_t colType, int32_t offset, int16_t colIdx); int32_t tdGetKvRowValOfCol(SCellVal *output, STSRow *pRow, void *pBitmap, int32_t offset, int16_t colIdx); +void tTSRowGetVal(STSRow *pRow, STSchema *pTSchema, int16_t iCol, SColVal *pColVal); typedef struct { STSchema *pSchema; diff --git a/source/common/src/trow.c b/source/common/src/trow.c index c8a28d7f28..deb99271c1 100644 --- a/source/common/src/trow.c +++ b/source/common/src/trow.c @@ -339,9 +339,9 @@ int32_t tdSetBitmapValTypeN(void *pBitmap, int16_t nEle, TDRowValT valType, int8 } bool tdIsBitmapBlkNorm(const void *pBitmap, int32_t numOfBits, int8_t bitmapMode) { - int32_t nBytes = (bitmapMode == 0 ? numOfBits / TD_VTYPE_PARTS : numOfBits / TD_VTYPE_PARTS_I); - uint8_t vTypeByte = tdVTypeByte[bitmapMode][TD_VTYPE_NORM]; - uint8_t *qBitmap = (uint8_t*)pBitmap; + int32_t nBytes = (bitmapMode == 0 ? numOfBits / TD_VTYPE_PARTS : numOfBits / TD_VTYPE_PARTS_I); + uint8_t vTypeByte = tdVTypeByte[bitmapMode][TD_VTYPE_NORM]; + uint8_t *qBitmap = (uint8_t *)pBitmap; for (int i = 0; i < nBytes; ++i) { if (*qBitmap != vTypeByte) { return false; @@ -1855,4 +1855,37 @@ void tdSTSRowIterReset(STSRowIter *pIter, STSRow *pRow) { void tdSTSRowIterInit(STSRowIter *pIter, STSchema *pSchema) { pIter->pSchema = pSchema; pIter->maxColId = pSchema->columns[pSchema->numOfCols - 1].colId; +} + +void tTSRowGetVal(STSRow *pRow, STSchema *pTSchema, int16_t iCol, SColVal *pColVal) { + STColumn *pTColumn = &pTSchema->columns[iCol]; + SCellVal cv; + SValue value; + + ASSERT(iCol > 0); + + if (TD_IS_TP_ROW(pRow)) { + tdSTpRowGetVal(pRow, pTColumn->colId, pTColumn->type, pTSchema->flen, pTColumn->offset, iCol - 1, &cv); + } else if (TD_IS_KV_ROW(pRow)) { + ASSERT(iCol > 0); + SKvRowIdx *pColIdx = tdKvRowColIdxAt(pRow, iCol - 1); + tdSKvRowGetVal(pRow, pTColumn->colId, pColIdx->offset, iCol - 1, &cv); + } else { + ASSERT(0); + } + + if (tdValTypeIsNone(cv.valType)) { + *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type); + } else if (tdValTypeIsNull(cv.valType)) { + *pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type); + } else { + if (IS_VAR_DATA_TYPE(pTColumn->type)) { + value.nData = varDataLen(cv.val); + value.pData = varDataVal(cv.val); + } else { + tGetValue(cv.val, &value, pTColumn->type); + } + + *pColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, value); + } } \ No newline at end of file diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index f5e6c5861b..849b5bd49a 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -115,7 +115,7 @@ void tColDataReset(SColData *pColData, int16_t cid, int8_t type); void tColDataClear(void *ph); int32_t tColDataAppendValue(SColData *pColData, SColVal *pColVal); int32_t tColDataGetValue(SColData *pColData, int32_t iRow, SColVal *pColVal); -int32_t tColDataCmprFn(const void *p1, const void *p2); +int32_t tColDataPCmprFn(const void *p1, const void *p2); // SBlockData int32_t tBlockDataInit(SBlockData *pBlockData); void tBlockDataReset(SBlockData *pBlockData); diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil.c b/source/dnode/vnode/src/tsdb/tsdbUtil.c index 82634253d4..acff2dfa54 100644 --- a/source/dnode/vnode/src/tsdb/tsdbUtil.c +++ b/source/dnode/vnode/src/tsdb/tsdbUtil.c @@ -509,58 +509,24 @@ void tsdbRowGetColVal(TSDBROW *pRow, STSchema *pTSchema, int32_t iCol, SColVal * ASSERT(iCol > 0); if (pRow->type == 0) { - // get from row (todo); + tTSRowGetVal(pRow->pTSRow, pTSchema, iCol, pColVal); } else if (pRow->type == 1) { - SColData *pColData; + SColData *pColData = &(SColData){.cid = pTColumn->colId}; void *p = NULL; - // TODO - ASSERT(0); - // p = taosbsearch(&(SColData){.cid = pTColumn->colId}, pRow->pBlockData->aColDataP, pRow->pBlockData->nColData, - // sizeof(SBlockCol), tColDataCmprFn, TD_EQ); + p = taosArraySearch(pRow->pBlockData->aColDataP, &pColData, tColDataPCmprFn, TD_EQ); if (p) { - pColData = (SColData *)p; - ASSERT(pColData->flag); + pColData = *(SColData **)p; - if (pColData->flag == HAS_NONE) { - goto _return_none; - } else if (pColData->flag == HAS_NULL) { - goto _return_null; - } else { - uint8_t v = GET_BIT2(pColData->pBitMap, pRow->iRow); - if (v == 0) { - goto _return_none; - } else if (v == 1) { - goto _return_null; - } else { - int32_t offset; - if (IS_VAR_DATA_TYPE(pTColumn->type)) { - // offset = ; (todo) - ASSERT(0); - } else { - offset = tDataTypes[pTColumn->type].bytes * pRow->iRow; - } - tGetValue(pColData->pData + offset, &value, pTColumn->type); - } - } + ASSERT(pColData->type == pTColumn->type); + + tColDataGetValue(pColData, pRow->iRow, pColVal); } else { - goto _return_none; + *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type); } } else { ASSERT(0); } - -_return_none: - *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type); - return; - -_return_null: - *pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type); - return; - -_return_value: - *pColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, value); - return; } int32_t tPutTSDBRow(uint8_t *p, TSDBROW *pRow) { @@ -880,10 +846,13 @@ _exit: return code; } -int32_t tColDataCmprFn(const void *p1, const void *p2) { - if (((SColData *)p1)->cid < ((SColData *)p2)->cid) { +int32_t tColDataPCmprFn(const void *p1, const void *p2) { + SColData *pColData1 = *(SColData **)p1; + SColData *pColData2 = *(SColData **)p2; + + if (pColData1->cid < pColData2->cid) { return -1; - } else if (((SColData *)p1)->cid > ((SColData *)p2)->cid) { + } else if (pColData1->cid > pColData2->cid) { return 1; }