Merge branch '3.0' into enh/TD-22715

This commit is contained in:
Yihao Deng 2023-02-23 19:13:43 +08:00 committed by GitHub
commit 02d0894d3e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 111 additions and 79 deletions

View File

@ -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 %] _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 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] _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 *************************** *************************** 3.row ***************************

View File

@ -1989,8 +1989,7 @@ static FORCE_INLINE int32_t tColDataUpdateValue20(SColData *pColData, uint8_t *p
return 0; return 0;
} }
static FORCE_INLINE int32_t tColDataUpdateValue30(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) { 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 (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) { // NONE ==> VALUE
if (bv == 0) { // NONE == > VALUE
pColData->numOfNone--; pColData->numOfNone--;
pColData->nVal--; pColData->nVal--;
if (pColData->numOfNone) { if (pColData->numOfNone) {
@ -1999,7 +1998,7 @@ static FORCE_INLINE int32_t tColDataUpdateValue30(SColData *pColData, uint8_t *p
pColData->flag = HAS_NULL; pColData->flag = HAS_NULL;
return tColDataAppendValue20(pColData, pData, nData); return tColDataAppendValue20(pColData, pData, nData);
} }
} else if (forward) { // NULL == > VALUE } else if (forward) { // NULL ==> VALUE
pColData->numOfNull--; pColData->numOfNull--;
pColData->nVal--; pColData->nVal--;
if (pColData->numOfNull) { if (pColData->numOfNull) {
@ -2024,36 +2023,43 @@ static FORCE_INLINE int32_t tColDataUpdateValue32(SColData *pColData, uint8_t *p
return 0; return 0;
} }
static FORCE_INLINE int32_t tColDataUpdateValue40(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) { static FORCE_INLINE int32_t tColDataUpdateValue40(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
if (forward) { if (forward) { // VALUE ==> VALUE
pColData->numOfValue--;
pColData->nVal--; pColData->nVal--;
if (pColData->numOfValue) { if (IS_VAR_DATA_TYPE(pColData->type)) {
return tColDataAppendValue40(pColData, pData, nData); pColData->nData = pColData->aOffset[pColData->nVal];
} else { } else {
pColData->flag = 0; pColData->nData -= TYPE_BYTES[pColData->type];
return tColDataAppendValue00(pColData, pData, nData);
} }
return tColDataPutValue(pColData, pData, nData);
} }
return 0; return 0;
} }
static FORCE_INLINE int32_t tColDataUpdateValue42(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) { 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->numOfValue--;
pColData->nVal--; pColData->nVal--;
if (pColData->numOfValue) { 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); return tColDataAppendValue42(pColData, pData, nData);
} else { } else {
pColData->flag = 0; pColData->flag = 0;
pColData->nData = 0;
return tColDataAppendValue02(pColData, pData, nData); return tColDataAppendValue02(pColData, pData, nData);
} }
} }
return 0; return 0;
} }
static FORCE_INLINE int32_t tColDataUpdateValue50(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) { 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 (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) { // NONE ==> VALUE
if (bv == 0) { // NONE ==> VALUE
pColData->numOfNone--; pColData->numOfNone--;
pColData->nVal--; pColData->nVal--;
if (!IS_VAR_DATA_TYPE(pColData->type)) {
pColData->nData -= TYPE_BYTES[pColData->type];
}
if (pColData->numOfNone) { if (pColData->numOfNone) {
return tColDataAppendValue50(pColData, pData, nData); return tColDataAppendValue50(pColData, pData, nData);
} else { } else {
@ -2061,35 +2067,42 @@ static FORCE_INLINE int32_t tColDataUpdateValue50(SColData *pColData, uint8_t *p
return tColDataAppendValue40(pColData, pData, nData); return tColDataAppendValue40(pColData, pData, nData);
} }
} else if (forward) { // VALUE ==> VALUE } else if (forward) { // VALUE ==> VALUE
pColData->numOfValue--;
pColData->nVal--; pColData->nVal--;
if (pColData->numOfValue) { if (IS_VAR_DATA_TYPE(pColData->type)) {
return tColDataAppendValue50(pColData, pData, nData); pColData->nData = pColData->aOffset[pColData->nVal];
} else { } else {
pColData->flag = HAS_NONE; pColData->nData -= TYPE_BYTES[pColData->type];
return tColDataAppendValue10(pColData, pData, nData);
} }
return tColDataPutValue(pColData, pData, nData);
} }
return 0; return 0;
} }
static FORCE_INLINE int32_t tColDataUpdateValue52(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) { 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 (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) { // NONE ==> NULL
if (bv == 0) { // NONE ==> NULL
pColData->numOfNone--; pColData->numOfNone--;
pColData->nVal--; pColData->nVal--;
if (!IS_VAR_DATA_TYPE(pColData->type)) {
pColData->nData -= TYPE_BYTES[pColData->type];
}
if (pColData->numOfNone) { if (pColData->numOfNone) {
return tColDataAppendValue52(pColData, pData, nData); return tColDataAppendValue52(pColData, pData, nData);
} else { } else {
pColData->flag &= ~HAS_NONE; pColData->flag = HAS_VALUE;
return tColDataAppendValue42(pColData, pData, nData); return tColDataAppendValue42(pColData, pData, nData);
} }
} else if (forward) { // VALUE ==> NULL } else if (forward) { // VALUE ==> NULL
pColData->numOfValue--; pColData->numOfValue--;
pColData->nVal--; pColData->nVal--;
if (pColData->numOfValue) { 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); return tColDataAppendValue52(pColData, pData, nData);
} else { } else {
pColData->flag &= ~HAS_VALUE; pColData->flag = HAS_NONE;
pColData->nData = 0;
return tColDataAppendValue12(pColData, pData, nData); return tColDataAppendValue12(pColData, pData, nData);
} }
} }
@ -2100,6 +2113,9 @@ static FORCE_INLINE int32_t tColDataUpdateValue60(SColData *pColData, uint8_t *p
if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) { // NULL ==> VALUE if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) { // NULL ==> VALUE
pColData->numOfNull--; pColData->numOfNull--;
pColData->nVal--; pColData->nVal--;
if (!IS_VAR_DATA_TYPE(pColData->type)) {
pColData->nData -= TYPE_BYTES[pColData->type];
}
if (pColData->numOfNull) { if (pColData->numOfNull) {
return tColDataAppendValue60(pColData, pData, nData); return tColDataAppendValue60(pColData, pData, nData);
} else { } else {
@ -2107,14 +2123,13 @@ static FORCE_INLINE int32_t tColDataUpdateValue60(SColData *pColData, uint8_t *p
return tColDataAppendValue40(pColData, pData, nData); return tColDataAppendValue40(pColData, pData, nData);
} }
} else { // VALUE ==> VALUE } else { // VALUE ==> VALUE
pColData->numOfValue--;
pColData->nVal--; pColData->nVal--;
if (pColData->numOfValue) { if (IS_VAR_DATA_TYPE(pColData->type)) {
return tColDataAppendValue60(pColData, pData, nData); pColData->nData = pColData->aOffset[pColData->nVal];
} else { } else {
pColData->flag = HAS_NULL; pColData->nData -= TYPE_BYTES[pColData->type];
return tColDataAppendValue20(pColData, pData, nData);
} }
return tColDataPutValue(pColData, pData, nData);
} }
} }
return 0; return 0;
@ -2124,9 +2139,15 @@ static FORCE_INLINE int32_t tColDataUpdateValue62(SColData *pColData, uint8_t *p
pColData->numOfValue--; pColData->numOfValue--;
pColData->nVal--; pColData->nVal--;
if (pColData->numOfValue) { 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); return tColDataAppendValue62(pColData, pData, nData);
} else { } else {
pColData->flag = HAS_NULL; pColData->flag = HAS_NULL;
pColData->nData = 0;
return tColDataAppendValue20(pColData, pData, nData); return tColDataAppendValue20(pColData, pData, nData);
} }
} }
@ -2139,38 +2160,44 @@ static FORCE_INLINE int32_t tColDataUpdateValue70(SColData *pColData, uint8_t *p
if (bv == 0) { // NONE ==> VALUE if (bv == 0) { // NONE ==> VALUE
pColData->numOfNone--; pColData->numOfNone--;
pColData->nVal--; pColData->nVal--;
if (!IS_VAR_DATA_TYPE(pColData->type)) {
pColData->nData -= TYPE_BYTES[pColData->type];
}
if (pColData->numOfNone) { if (pColData->numOfNone) {
return tColDataAppendValue70(pColData, pData, nData); return tColDataAppendValue70(pColData, pData, nData);
} else { } else {
for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) { for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal) - 1); 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); return tColDataAppendValue60(pColData, pData, nData);
} }
} else if (bv == 1) { // NULL ==> VALUE } else if (bv == 1) { // NULL ==> VALUE
if (forward) { if (forward) {
pColData->numOfNull--; pColData->numOfNull--;
pColData->nVal--; pColData->nVal--;
if (!IS_VAR_DATA_TYPE(pColData->type)) {
pColData->nData -= TYPE_BYTES[pColData->type];
}
if (pColData->numOfNull) { if (pColData->numOfNull) {
return tColDataAppendValue70(pColData, pData, nData); return tColDataAppendValue70(pColData, pData, nData);
} else { } else {
for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) { for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal) ? 1 : 0); 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); return tColDataAppendValue50(pColData, pData, nData);
} }
} }
} else if (bv == 2) { // VALUE ==> VALUE } else if (bv == 2) { // VALUE ==> VALUE
if (forward) { if (forward) {
pColData->numOfValue--;
pColData->nVal--; pColData->nVal--;
if (pColData->numOfValue) { if (IS_VAR_DATA_TYPE(pColData->type)) {
return tColDataAppendValue70(pColData, pData, nData); pColData->nData = pColData->aOffset[pColData->nVal];
} else { } else {
return tColDataPutValue(pColData, pData, nData); pColData->nData -= TYPE_BYTES[pColData->type];
} }
return tColDataPutValue(pColData, pData, nData);
} }
} else { } else {
ASSERT(0); ASSERT(0);
@ -2179,29 +2206,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) { static int32_t tColDataUpdateValue72(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
uint8_t bv = GET_BIT2(pColData->pBitMap, pColData->nVal - 1); uint8_t bv = GET_BIT2(pColData->pBitMap, pColData->nVal - 1);
ASSERT(bv < 3);
if (bv == 0) { // NONE ==> NULL if (bv == 0) { // NONE ==> NULL
pColData->numOfNone--; pColData->numOfNone--;
pColData->nVal--; pColData->nVal--;
if (!IS_VAR_DATA_TYPE(pColData->type)) {
pColData->nData -= TYPE_BYTES[pColData->type];
}
if (pColData->numOfNone) { if (pColData->numOfNone) {
return tColDataAppendValue72(pColData, pData, nData); return tColDataAppendValue72(pColData, pData, nData);
} else { } else {
for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) { for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal) - 1); 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); return tColDataAppendValue62(pColData, pData, nData);
} }
} else if (bv == 2 && forward) { // VALUE ==> NULL } else if (bv == 2 && forward) { // VALUE ==> NULL
pColData->numOfValue--; pColData->numOfValue--;
pColData->nVal--; pColData->nVal--;
if (pColData->numOfValue) { 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); return tColDataAppendValue72(pColData, pData, nData);
} else { } else {
for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) { for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, 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); return tColDataAppendValue32(pColData, pData, nData);
} }
} }

View File

@ -1687,53 +1687,50 @@ int32_t percentileFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
double v = 0; double v = 0;
tMemBucket* pMemBucket = ppInfo->pMemBucket; tMemBucket* pMemBucket = ppInfo->pMemBucket;
if (pMemBucket == NULL || pMemBucket->total == 0) { // check for null if (pMemBucket != NULL && pMemBucket->total > 0) { // check for null
code = TSDB_CODE_FAILED; if (pCtx->numOfParams > 2) {
goto _fin_error; char buf[512] = {0};
} size_t len = 1;
if (pCtx->numOfParams > 2) { varDataVal(buf)[0] = '[';
char buf[512] = {0}; for (int32_t i = 1; i < pCtx->numOfParams; ++i) {
size_t len = 1; SVariant* pVal = &pCtx->param[i].param;
varDataVal(buf)[0] = '['; GET_TYPED_DATA(v, double, pVal->nType, &pVal->i);
for (int32_t i = 1; i < pCtx->numOfParams; ++i) {
SVariant* pVal = &pCtx->param[i].param; 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); 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) { if (code != TSDB_CODE_SUCCESS) {
goto _fin_error; goto _fin_error;
} }
if (i == pCtx->numOfParams - 1) { tMemBucketDestroy(pMemBucket);
len += snprintf(varDataVal(buf) + len, sizeof(buf) - VARSTR_HEADER_SIZE - len, "%.6lf]", ppInfo->result); return functionFinalize(pCtx, pBlock);
} 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);
code = getPercentile(pMemBucket, v, &ppInfo->result);
if (code != TSDB_CODE_SUCCESS) {
goto _fin_error;
}
tMemBucketDestroy(pMemBucket);
return functionFinalize(pCtx, pBlock);
} }
_fin_error: _fin_error: