From f1b57ac74cb8642da572ca2756169caa9fe808f6 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 22 Feb 2023 17:54:17 +0800 Subject: [PATCH 1/3] fix: col data update bug --- source/common/src/tdataformat.c | 105 +++++++++++++++++++++----------- 1 file changed, 70 insertions(+), 35 deletions(-) diff --git a/source/common/src/tdataformat.c b/source/common/src/tdataformat.c index 7c0de3d6f0..b52af85ecf 100644 --- a/source/common/src/tdataformat.c +++ b/source/common/src/tdataformat.c @@ -1980,8 +1980,7 @@ static FORCE_INLINE int32_t tColDataUpdateValue20(SColData *pColData, uint8_t *p return 0; } static FORCE_INLINE int32_t tColDataUpdateValue30(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) { - uint8_t bv = GET_BIT1(pColData->pBitMap, pColData->nVal - 1); - if (bv == 0) { // NONE == > VALUE + if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) { // NONE ==> VALUE pColData->numOfNone--; pColData->nVal--; if (pColData->numOfNone) { @@ -1990,7 +1989,7 @@ static FORCE_INLINE int32_t tColDataUpdateValue30(SColData *pColData, uint8_t *p pColData->flag = HAS_NULL; return tColDataAppendValue20(pColData, pData, nData); } - } else if (forward) { // NULL == > VALUE + } else if (forward) { // NULL ==> VALUE pColData->numOfNull--; pColData->nVal--; if (pColData->numOfNull) { @@ -2015,36 +2014,43 @@ static FORCE_INLINE int32_t tColDataUpdateValue32(SColData *pColData, uint8_t *p return 0; } static FORCE_INLINE int32_t tColDataUpdateValue40(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) { - if (forward) { - pColData->numOfValue--; + if (forward) { // VALUE ==> VALUE pColData->nVal--; - if (pColData->numOfValue) { - return tColDataAppendValue40(pColData, pData, nData); + if (IS_VAR_DATA_TYPE(pColData->type)) { + pColData->nData = pColData->aOffset[pColData->nVal]; } else { - pColData->flag = 0; - return tColDataAppendValue00(pColData, pData, nData); + pColData->nData -= TYPE_BYTES[pColData->type]; } + return tColDataPutValue(pColData, pData, nData); } return 0; } static FORCE_INLINE int32_t tColDataUpdateValue42(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) { - if (forward) { + if (forward) { // VALUE ==> NULL pColData->numOfValue--; pColData->nVal--; if (pColData->numOfValue) { + if (IS_VAR_DATA_TYPE(pColData->type)) { + pColData->nData = pColData->aOffset[pColData->nVal]; + } else { + pColData->nData -= TYPE_BYTES[pColData->type]; + } return tColDataAppendValue42(pColData, pData, nData); } else { pColData->flag = 0; + pColData->nData = 0; return tColDataAppendValue02(pColData, pData, nData); } } return 0; } static FORCE_INLINE int32_t tColDataUpdateValue50(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) { - uint8_t bv = GET_BIT1(pColData->pBitMap, pColData->nVal - 1); - if (bv == 0) { // NONE ==> VALUE + if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) { // NONE ==> VALUE pColData->numOfNone--; pColData->nVal--; + if (!IS_VAR_DATA_TYPE(pColData->type)) { + pColData->nData -= TYPE_BYTES[pColData->type]; + } if (pColData->numOfNone) { return tColDataAppendValue50(pColData, pData, nData); } else { @@ -2052,35 +2058,42 @@ static FORCE_INLINE int32_t tColDataUpdateValue50(SColData *pColData, uint8_t *p return tColDataAppendValue40(pColData, pData, nData); } } else if (forward) { // VALUE ==> VALUE - pColData->numOfValue--; pColData->nVal--; - if (pColData->numOfValue) { - return tColDataAppendValue50(pColData, pData, nData); + if (IS_VAR_DATA_TYPE(pColData->type)) { + pColData->nData = pColData->aOffset[pColData->nVal]; } else { - pColData->flag = HAS_NONE; - return tColDataAppendValue10(pColData, pData, nData); + pColData->nData -= TYPE_BYTES[pColData->type]; } + return tColDataPutValue(pColData, pData, nData); } return 0; } static FORCE_INLINE int32_t tColDataUpdateValue52(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) { - uint8_t bv = GET_BIT1(pColData->pBitMap, pColData->nVal - 1); - if (bv == 0) { // NONE ==> NULL + if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) { // NONE ==> NULL pColData->numOfNone--; pColData->nVal--; + if (!IS_VAR_DATA_TYPE(pColData->type)) { + pColData->nData -= TYPE_BYTES[pColData->type]; + } if (pColData->numOfNone) { return tColDataAppendValue52(pColData, pData, nData); } else { - pColData->flag &= ~HAS_NONE; + pColData->flag = HAS_VALUE; return tColDataAppendValue42(pColData, pData, nData); } } else if (forward) { // VALUE ==> NULL pColData->numOfValue--; pColData->nVal--; if (pColData->numOfValue) { + if (IS_VAR_DATA_TYPE(pColData->type)) { + pColData->nData = pColData->aOffset[pColData->nVal]; + } else { + pColData->nData -= TYPE_BYTES[pColData->type]; + } return tColDataAppendValue52(pColData, pData, nData); } else { - pColData->flag &= ~HAS_VALUE; + pColData->flag = HAS_NONE; + pColData->nData = 0; return tColDataAppendValue12(pColData, pData, nData); } } @@ -2091,6 +2104,9 @@ static FORCE_INLINE int32_t tColDataUpdateValue60(SColData *pColData, uint8_t *p if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) { // NULL ==> VALUE pColData->numOfNull--; pColData->nVal--; + if (!IS_VAR_DATA_TYPE(pColData->type)) { + pColData->nData -= TYPE_BYTES[pColData->type]; + } if (pColData->numOfNull) { return tColDataAppendValue60(pColData, pData, nData); } else { @@ -2098,14 +2114,13 @@ static FORCE_INLINE int32_t tColDataUpdateValue60(SColData *pColData, uint8_t *p return tColDataAppendValue40(pColData, pData, nData); } } else { // VALUE ==> VALUE - pColData->numOfValue--; pColData->nVal--; - if (pColData->numOfValue) { - return tColDataAppendValue60(pColData, pData, nData); + if (IS_VAR_DATA_TYPE(pColData->type)) { + pColData->nData = pColData->aOffset[pColData->nVal]; } else { - pColData->flag = HAS_NULL; - return tColDataAppendValue20(pColData, pData, nData); + pColData->nData -= TYPE_BYTES[pColData->type]; } + return tColDataPutValue(pColData, pData, nData); } } return 0; @@ -2115,9 +2130,15 @@ static FORCE_INLINE int32_t tColDataUpdateValue62(SColData *pColData, uint8_t *p pColData->numOfValue--; pColData->nVal--; if (pColData->numOfValue) { + if (IS_VAR_DATA_TYPE(pColData->type)) { + pColData->nData = pColData->aOffset[pColData->nVal]; + } else { + pColData->nData -= TYPE_BYTES[pColData->type]; + } return tColDataAppendValue62(pColData, pData, nData); } else { pColData->flag = HAS_NULL; + pColData->nData = 0; return tColDataAppendValue20(pColData, pData, nData); } } @@ -2130,38 +2151,44 @@ static FORCE_INLINE int32_t tColDataUpdateValue70(SColData *pColData, uint8_t *p if (bv == 0) { // NONE ==> VALUE pColData->numOfNone--; pColData->nVal--; + if (!IS_VAR_DATA_TYPE(pColData->type)) { + pColData->nData -= TYPE_BYTES[pColData->type]; + } if (pColData->numOfNone) { return tColDataAppendValue70(pColData, pData, nData); } else { for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) { SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal) - 1); } - pColData->flag &= ~HAS_NONE; + pColData->flag = (HAS_VALUE | HAS_NULL); return tColDataAppendValue60(pColData, pData, nData); } } else if (bv == 1) { // NULL ==> VALUE if (forward) { pColData->numOfNull--; pColData->nVal--; + if (!IS_VAR_DATA_TYPE(pColData->type)) { + pColData->nData -= TYPE_BYTES[pColData->type]; + } if (pColData->numOfNull) { return tColDataAppendValue70(pColData, pData, nData); } else { for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) { SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal) ? 1 : 0); } - pColData->flag &= ~HAS_NULL; + pColData->flag = (HAS_VALUE | HAS_NONE); return tColDataAppendValue50(pColData, pData, nData); } } } else if (bv == 2) { // VALUE ==> VALUE if (forward) { - pColData->numOfValue--; pColData->nVal--; - if (pColData->numOfValue) { - return tColDataAppendValue70(pColData, pData, nData); + if (IS_VAR_DATA_TYPE(pColData->type)) { + pColData->nData = pColData->aOffset[pColData->nVal]; } else { - return tColDataPutValue(pColData, pData, nData); + pColData->nData -= TYPE_BYTES[pColData->type]; } + return tColDataPutValue(pColData, pData, nData); } } else { ASSERT(0); @@ -2170,29 +2197,37 @@ static FORCE_INLINE int32_t tColDataUpdateValue70(SColData *pColData, uint8_t *p } static int32_t tColDataUpdateValue72(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) { uint8_t bv = GET_BIT2(pColData->pBitMap, pColData->nVal - 1); - ASSERT(bv < 3); if (bv == 0) { // NONE ==> NULL pColData->numOfNone--; pColData->nVal--; + if (!IS_VAR_DATA_TYPE(pColData->type)) { + pColData->nData -= TYPE_BYTES[pColData->type]; + } if (pColData->numOfNone) { return tColDataAppendValue72(pColData, pData, nData); } else { for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) { SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal) - 1); } - pColData->flag &= ~HAS_NONE; + pColData->flag = (HAS_VALUE | HAS_NULL); return tColDataAppendValue62(pColData, pData, nData); } } else if (bv == 2 && forward) { // VALUE ==> NULL pColData->numOfValue--; pColData->nVal--; if (pColData->numOfValue) { + if (IS_STR_DATA_TYPE(pColData->type)) { + pColData->nData = pColData->aOffset[pColData->nVal]; + } else { + pColData->nData -= TYPE_BYTES[pColData->type]; + } return tColDataAppendValue72(pColData, pData, nData); } else { for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) { SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal)); } - pColData->flag &= ~HAS_VALUE; + pColData->flag = (HAS_NULL | HAS_NONE); + pColData->nData = 0; return tColDataAppendValue32(pColData, pData, nData); } } From 5d5aad9ad756046a8a66a781703249e8ee48d60b Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Thu, 23 Feb 2023 17:03:21 +0800 Subject: [PATCH 2/3] fix: percentile finalize wrong error code issue --- source/libs/function/src/builtinsimpl.c | 71 ++++++++++++------------- 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/source/libs/function/src/builtinsimpl.c b/source/libs/function/src/builtinsimpl.c index 8e52ae5f30..5f8c35a841 100644 --- a/source/libs/function/src/builtinsimpl.c +++ b/source/libs/function/src/builtinsimpl.c @@ -1689,53 +1689,50 @@ int32_t percentileFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) { double v = 0; tMemBucket* pMemBucket = ppInfo->pMemBucket; - if (pMemBucket == NULL || pMemBucket->total == 0) { // check for null - code = TSDB_CODE_FAILED; - goto _fin_error; - } + if (pMemBucket != NULL && pMemBucket->total > 0) { // check for null + if (pCtx->numOfParams > 2) { + char buf[512] = {0}; + size_t len = 1; - if (pCtx->numOfParams > 2) { - char buf[512] = {0}; - size_t len = 1; + varDataVal(buf)[0] = '['; + for (int32_t i = 1; i < pCtx->numOfParams; ++i) { + SVariant* pVal = &pCtx->param[i].param; - varDataVal(buf)[0] = '['; - for (int32_t i = 1; i < pCtx->numOfParams; ++i) { - SVariant* pVal = &pCtx->param[i].param; + GET_TYPED_DATA(v, double, pVal->nType, &pVal->i); + + int32_t code = getPercentile(pMemBucket, v, &ppInfo->result); + if (code != TSDB_CODE_SUCCESS) { + goto _fin_error; + } + + if (i == pCtx->numOfParams - 1) { + len += snprintf(varDataVal(buf) + len, sizeof(buf) - VARSTR_HEADER_SIZE - len, "%.6lf]", ppInfo->result); + } else { + len += snprintf(varDataVal(buf) + len, sizeof(buf) - VARSTR_HEADER_SIZE - len, "%.6lf, ", ppInfo->result); + } + } + + int32_t slotId = pCtx->pExpr->base.resSchema.slotId; + SColumnInfoData* pCol = taosArrayGet(pBlock->pDataBlock, slotId); + + varDataSetLen(buf, len); + colDataAppend(pCol, pBlock->info.rows, buf, false); + + tMemBucketDestroy(pMemBucket); + return pResInfo->numOfRes; + } else { + SVariant* pVal = &pCtx->param[1].param; GET_TYPED_DATA(v, double, pVal->nType, &pVal->i); - int32_t code = getPercentile(pMemBucket, v, &ppInfo->result); + code = getPercentile(pMemBucket, v, &ppInfo->result); if (code != TSDB_CODE_SUCCESS) { goto _fin_error; } - if (i == pCtx->numOfParams - 1) { - len += snprintf(varDataVal(buf) + len, sizeof(buf) - VARSTR_HEADER_SIZE - len, "%.6lf]", ppInfo->result); - } else { - len += snprintf(varDataVal(buf) + len, sizeof(buf) - VARSTR_HEADER_SIZE - len, "%.6lf, ", ppInfo->result); - } + tMemBucketDestroy(pMemBucket); + return functionFinalize(pCtx, pBlock); } - - int32_t slotId = pCtx->pExpr->base.resSchema.slotId; - SColumnInfoData* pCol = taosArrayGet(pBlock->pDataBlock, slotId); - - varDataSetLen(buf, len); - colDataAppend(pCol, pBlock->info.rows, buf, false); - - tMemBucketDestroy(pMemBucket); - return pResInfo->numOfRes; - } else { - SVariant* pVal = &pCtx->param[1].param; - - GET_TYPED_DATA(v, double, pVal->nType, &pVal->i); - - code = getPercentile(pMemBucket, v, &ppInfo->result); - if (code != TSDB_CODE_SUCCESS) { - goto _fin_error; - } - - tMemBucketDestroy(pMemBucket); - return functionFinalize(pCtx, pBlock); } _fin_error: From 591feef406555305462206509d4805c9687c4f1d Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 23 Feb 2023 18:25:34 +0800 Subject: [PATCH 3/3] Update 24-show.md --- docs/zh/12-taos-sql/24-show.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/zh/12-taos-sql/24-show.md b/docs/zh/12-taos-sql/24-show.md index c8f4afc06b..901548e132 100644 --- a/docs/zh/12-taos-sql/24-show.md +++ b/docs/zh/12-taos-sql/24-show.md @@ -191,9 +191,9 @@ SHOW TABLE DISTRIBUTED table_name; _block_dist: Total_Blocks=[5] Total_Size=[93.65 Kb] Average_size=[18.73 Kb] Compression_Ratio=[23.98 %] -Total_Blocks : 表d0 占用的 block 个数为 5 个 +Total_Blocks: 表 d0 占用的 block 个数为 5 个 -Total_Size. : 表 d0 所有 block 在文件中占用的大小为 93.65 KB +Total_Size: 表 d0 所有 block 在文件中占用的大小为 93.65 KB Average_size: 平均每个 block 在文件中占用的空间大小为 18.73 KB @@ -204,15 +204,15 @@ Compression_Ratio: 数据压缩率 23.98% _block_dist: Total_Rows=[20000] Inmem_Rows=[0] MinRows=[3616] MaxRows=[4096] Average_Rows=[4000] -Total_Rows: 统计表 d0 的所有行数 为20000 行 +Total_Rows: 统计表 d0 的所有行数 为20000 行(该数值仅供参考,不是精确的行数。获得精确的行数需要使用 count 函数) -Inmem_Rows: 表示仍然还存放在内存中的行数,即没有落盘的行数,为 0行,表示没有 +Inmem_Rows: 存储在写缓存中的数据行数(没有落盘),0 行表示内存缓存中没有数据 -MinRows: BLOCK 中最小的行数,为 3616 行 +MinRows: BLOCK 中最小的行数,为 3616 行 -MaxRows: BLOCK 中最大的行数,为 4096行 +MaxRows: BLOCK 中最大的行数,为 4096 行 -Average_Rows: 每个 BLOCK 中的平均行数,为4000 行 +Average_Rows: 每个 BLOCK 中的平均行数,此时为 4000 行 *************************** 3.row ***************************