Merge pull request #17041 from taosdata/enh/cv_optimize
enh: cv optimize
This commit is contained in:
commit
5cfd98f3e2
|
@ -66,10 +66,18 @@ int32_t tGetValue(uint8_t *p, SValue *pValue, int8_t type);
|
||||||
int tValueCmprFn(const SValue *pValue1, const SValue *pValue2, int8_t type);
|
int tValueCmprFn(const SValue *pValue1, const SValue *pValue2, int8_t type);
|
||||||
|
|
||||||
// SColVal ================================
|
// SColVal ================================
|
||||||
#define COL_VAL_NONE(CID, TYPE) ((SColVal){.cid = (CID), .type = (TYPE), .isNone = 1})
|
#define CV_FLAG_VALUE ((int8_t)0x0)
|
||||||
#define COL_VAL_NULL(CID, TYPE) ((SColVal){.cid = (CID), .type = (TYPE), .isNull = 1})
|
#define CV_FLAG_NONE ((int8_t)0x1)
|
||||||
|
#define CV_FLAG_NULL ((int8_t)0x2)
|
||||||
|
|
||||||
|
#define COL_VAL_NONE(CID, TYPE) ((SColVal){.cid = (CID), .type = (TYPE), .flag = CV_FLAG_NONE})
|
||||||
|
#define COL_VAL_NULL(CID, TYPE) ((SColVal){.cid = (CID), .type = (TYPE), .flag = CV_FLAG_NULL})
|
||||||
#define COL_VAL_VALUE(CID, TYPE, V) ((SColVal){.cid = (CID), .type = (TYPE), .value = (V)})
|
#define COL_VAL_VALUE(CID, TYPE, V) ((SColVal){.cid = (CID), .type = (TYPE), .value = (V)})
|
||||||
|
|
||||||
|
#define COL_VAL_IS_NONE(CV) ((CV)->flag == CV_FLAG_NONE)
|
||||||
|
#define COL_VAL_IS_NULL(CV) ((CV)->flag == CV_FLAG_NULL)
|
||||||
|
#define COL_VAL_IS_VALUE(CV) ((CV)->flag == CV_FLAG_VALUE)
|
||||||
|
|
||||||
// STSRow2 ================================
|
// STSRow2 ================================
|
||||||
#define TSROW_LEN(PROW, V) tGetI32v((uint8_t *)(PROW)->data, (V) ? &(V) : NULL)
|
#define TSROW_LEN(PROW, V) tGetI32v((uint8_t *)(PROW)->data, (V) ? &(V) : NULL)
|
||||||
#define TSROW_SVER(PROW, V) tGetI32v((PROW)->data + TSROW_LEN(PROW, NULL), (V) ? &(V) : NULL)
|
#define TSROW_SVER(PROW, V) tGetI32v((PROW)->data + TSROW_LEN(PROW, NULL), (V) ? &(V) : NULL)
|
||||||
|
@ -175,8 +183,7 @@ struct SValue {
|
||||||
struct SColVal {
|
struct SColVal {
|
||||||
int16_t cid;
|
int16_t cid;
|
||||||
int8_t type;
|
int8_t type;
|
||||||
int8_t isNone;
|
int8_t flag;
|
||||||
int8_t isNull;
|
|
||||||
SValue value;
|
SValue value;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -212,9 +212,9 @@ int32_t tTSRowNew(STSRowBuilder *pBuilder, SArray *pArray, STSchema *pTSchema, S
|
||||||
if (pColVal->cid == pTColumn->colId) {
|
if (pColVal->cid == pTColumn->colId) {
|
||||||
iColVal++;
|
iColVal++;
|
||||||
|
|
||||||
if (pColVal->isNone) {
|
if (COL_VAL_IS_NONE(pColVal)) {
|
||||||
flags |= TSROW_HAS_NONE;
|
flags |= TSROW_HAS_NONE;
|
||||||
} else if (pColVal->isNull) {
|
} else if (COL_VAL_IS_NULL(pColVal)) {
|
||||||
flags |= TSROW_HAS_NULL;
|
flags |= TSROW_HAS_NULL;
|
||||||
maxIdx = nkv;
|
maxIdx = nkv;
|
||||||
nTag++;
|
nTag++;
|
||||||
|
@ -398,9 +398,9 @@ int32_t tTSRowNew(STSRowBuilder *pBuilder, SArray *pArray, STSchema *pTSchema, S
|
||||||
if (pColVal->cid == pTColumn->colId) {
|
if (pColVal->cid == pTColumn->colId) {
|
||||||
iColVal++;
|
iColVal++;
|
||||||
|
|
||||||
if (pColVal->isNone) {
|
if (COL_VAL_IS_NONE(pColVal)) {
|
||||||
goto _set_none;
|
goto _set_none;
|
||||||
} else if (pColVal->isNull) {
|
} else if (COL_VAL_IS_NULL(pColVal)) {
|
||||||
goto _set_null;
|
goto _set_null;
|
||||||
} else {
|
} else {
|
||||||
goto _set_value;
|
goto _set_value;
|
||||||
|
@ -1222,9 +1222,9 @@ _exit:
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue0(SColData *pColData, SColVal *pColVal) { // 0
|
static FORCE_INLINE int32_t tColDataAppendValue0(SColData *pColData, SColVal *pColVal) { // 0
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
if (pColVal->isNone) {
|
if (COL_VAL_IS_NONE(pColVal)) {
|
||||||
pColData->flag = HAS_NONE;
|
pColData->flag = HAS_NONE;
|
||||||
} else if (pColVal->isNull) {
|
} else if (COL_VAL_IS_NULL(pColVal)) {
|
||||||
pColData->flag = HAS_NULL;
|
pColData->flag = HAS_NULL;
|
||||||
} else {
|
} else {
|
||||||
pColData->flag = HAS_VALUE;
|
pColData->flag = HAS_VALUE;
|
||||||
|
@ -1239,7 +1239,7 @@ _exit:
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue1(SColData *pColData, SColVal *pColVal) { // HAS_NONE
|
static FORCE_INLINE int32_t tColDataAppendValue1(SColData *pColData, SColVal *pColVal) { // HAS_NONE
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
if (!pColVal->isNone) {
|
if (!COL_VAL_IS_NONE(pColVal)) {
|
||||||
int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
|
int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
|
||||||
|
|
||||||
code = tRealloc(&pColData->pBitMap, nBit);
|
code = tRealloc(&pColData->pBitMap, nBit);
|
||||||
|
@ -1248,7 +1248,7 @@ static FORCE_INLINE int32_t tColDataAppendValue1(SColData *pColData, SColVal *pC
|
||||||
memset(pColData->pBitMap, 0, nBit);
|
memset(pColData->pBitMap, 0, nBit);
|
||||||
SET_BIT1(pColData->pBitMap, pColData->nVal, 1);
|
SET_BIT1(pColData->pBitMap, pColData->nVal, 1);
|
||||||
|
|
||||||
if (pColVal->isNull) {
|
if (COL_VAL_IS_NULL(pColVal)) {
|
||||||
pColData->flag |= HAS_NULL;
|
pColData->flag |= HAS_NULL;
|
||||||
} else {
|
} else {
|
||||||
pColData->flag |= HAS_VALUE;
|
pColData->flag |= HAS_VALUE;
|
||||||
|
@ -1279,12 +1279,12 @@ _exit:
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue2(SColData *pColData, SColVal *pColVal) { // HAS_NULL
|
static FORCE_INLINE int32_t tColDataAppendValue2(SColData *pColData, SColVal *pColVal) { // HAS_NULL
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
if (!pColVal->isNull) {
|
if (!COL_VAL_IS_NULL(pColVal)) {
|
||||||
int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
|
int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
|
||||||
code = tRealloc(&pColData->pBitMap, nBit);
|
code = tRealloc(&pColData->pBitMap, nBit);
|
||||||
if (code) goto _exit;
|
if (code) goto _exit;
|
||||||
|
|
||||||
if (pColVal->isNone) {
|
if (COL_VAL_IS_NONE(pColVal)) {
|
||||||
pColData->flag |= HAS_NONE;
|
pColData->flag |= HAS_NONE;
|
||||||
|
|
||||||
memset(pColData->pBitMap, 255, nBit);
|
memset(pColData->pBitMap, 255, nBit);
|
||||||
|
@ -1321,12 +1321,12 @@ _exit:
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue3(SColData *pColData, SColVal *pColVal) { // HAS_NULL|HAS_NONE
|
static FORCE_INLINE int32_t tColDataAppendValue3(SColData *pColData, SColVal *pColVal) { // HAS_NULL|HAS_NONE
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
if (pColVal->isNone) {
|
if (COL_VAL_IS_NONE(pColVal)) {
|
||||||
code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
|
code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
|
||||||
if (code) goto _exit;
|
if (code) goto _exit;
|
||||||
|
|
||||||
SET_BIT1(pColData->pBitMap, pColData->nVal, 0);
|
SET_BIT1(pColData->pBitMap, pColData->nVal, 0);
|
||||||
} else if (pColVal->isNull) {
|
} else if (COL_VAL_IS_NULL(pColVal)) {
|
||||||
code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
|
code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
|
||||||
if (code) goto _exit;
|
if (code) goto _exit;
|
||||||
|
|
||||||
|
@ -1371,8 +1371,8 @@ _exit:
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue4(SColData *pColData, SColVal *pColVal) { // HAS_VALUE
|
static FORCE_INLINE int32_t tColDataAppendValue4(SColData *pColData, SColVal *pColVal) { // HAS_VALUE
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
if (pColVal->isNone || pColVal->isNull) {
|
if (!COL_VAL_IS_VALUE(pColVal)) {
|
||||||
if (pColVal->isNone) {
|
if (COL_VAL_IS_NONE(pColVal)) {
|
||||||
pColData->flag |= HAS_NONE;
|
pColData->flag |= HAS_NONE;
|
||||||
} else {
|
} else {
|
||||||
pColData->flag |= HAS_NULL;
|
pColData->flag |= HAS_NULL;
|
||||||
|
@ -1399,7 +1399,7 @@ _exit:
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue5(SColData *pColData, SColVal *pColVal) { // HAS_VALUE|HAS_NONE
|
static FORCE_INLINE int32_t tColDataAppendValue5(SColData *pColData, SColVal *pColVal) { // HAS_VALUE|HAS_NONE
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
if (pColVal->isNull) {
|
if (COL_VAL_IS_NULL(pColVal)) {
|
||||||
pColData->flag |= HAS_NULL;
|
pColData->flag |= HAS_NULL;
|
||||||
|
|
||||||
uint8_t *pBitMap = NULL;
|
uint8_t *pBitMap = NULL;
|
||||||
|
@ -1417,7 +1417,7 @@ static FORCE_INLINE int32_t tColDataAppendValue5(SColData *pColData, SColVal *pC
|
||||||
code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
|
code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
|
||||||
if (code) goto _exit;
|
if (code) goto _exit;
|
||||||
|
|
||||||
if (pColVal->isNone) {
|
if (COL_VAL_IS_NONE(pColVal)) {
|
||||||
SET_BIT1(pColData->pBitMap, pColData->nVal, 0);
|
SET_BIT1(pColData->pBitMap, pColData->nVal, 0);
|
||||||
} else {
|
} else {
|
||||||
SET_BIT1(pColData->pBitMap, pColData->nVal, 1);
|
SET_BIT1(pColData->pBitMap, pColData->nVal, 1);
|
||||||
|
@ -1434,7 +1434,7 @@ _exit:
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue6(SColData *pColData, SColVal *pColVal) { // HAS_VALUE|HAS_NULL
|
static FORCE_INLINE int32_t tColDataAppendValue6(SColData *pColData, SColVal *pColVal) { // HAS_VALUE|HAS_NULL
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
if (pColVal->isNone) {
|
if (COL_VAL_IS_NONE(pColVal)) {
|
||||||
pColData->flag |= HAS_NONE;
|
pColData->flag |= HAS_NONE;
|
||||||
|
|
||||||
uint8_t *pBitMap = NULL;
|
uint8_t *pBitMap = NULL;
|
||||||
|
@ -1452,7 +1452,7 @@ static FORCE_INLINE int32_t tColDataAppendValue6(SColData *pColData, SColVal *pC
|
||||||
code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
|
code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
|
||||||
if (code) goto _exit;
|
if (code) goto _exit;
|
||||||
|
|
||||||
if (pColVal->isNull) {
|
if (COL_VAL_IS_NULL(pColVal)) {
|
||||||
SET_BIT1(pColData->pBitMap, pColData->nVal, 0);
|
SET_BIT1(pColData->pBitMap, pColData->nVal, 0);
|
||||||
} else {
|
} else {
|
||||||
SET_BIT1(pColData->pBitMap, pColData->nVal, 1);
|
SET_BIT1(pColData->pBitMap, pColData->nVal, 1);
|
||||||
|
@ -1473,9 +1473,9 @@ static FORCE_INLINE int32_t tColDataAppendValue7(SColData *pColData,
|
||||||
code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
|
code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
|
||||||
if (code) goto _exit;
|
if (code) goto _exit;
|
||||||
|
|
||||||
if (pColVal->isNone) {
|
if (COL_VAL_IS_NONE(pColVal)) {
|
||||||
SET_BIT2(pColData->pBitMap, pColData->nVal, 0);
|
SET_BIT2(pColData->pBitMap, pColData->nVal, 0);
|
||||||
} else if (pColVal->isNull) {
|
} else if (COL_VAL_IS_NULL(pColVal)) {
|
||||||
SET_BIT2(pColData->pBitMap, pColData->nVal, 1);
|
SET_BIT2(pColData->pBitMap, pColData->nVal, 1);
|
||||||
} else {
|
} else {
|
||||||
SET_BIT2(pColData->pBitMap, pColData->nVal, 2);
|
SET_BIT2(pColData->pBitMap, pColData->nVal, 2);
|
||||||
|
|
|
@ -620,7 +620,7 @@ int32_t tdSTSRowNew(SArray *pArray, STSchema *pTSchema, STSRow **ppRow) {
|
||||||
ASSERT(pTColumn->colId == PRIMARYKEY_TIMESTAMP_COL_ID);
|
ASSERT(pTColumn->colId == PRIMARYKEY_TIMESTAMP_COL_ID);
|
||||||
} else {
|
} else {
|
||||||
if (IS_VAR_DATA_TYPE(pTColumn->type)) {
|
if (IS_VAR_DATA_TYPE(pTColumn->type)) {
|
||||||
if (pColVal && !pColVal->isNone && !pColVal->isNull) {
|
if (pColVal && COL_VAL_IS_VALUE(pColVal)) {
|
||||||
varDataLen += (pColVal->value.nData + sizeof(VarDataLenT));
|
varDataLen += (pColVal->value.nData + sizeof(VarDataLenT));
|
||||||
if (maxVarDataLen < (pColVal->value.nData + sizeof(VarDataLenT))) {
|
if (maxVarDataLen < (pColVal->value.nData + sizeof(VarDataLenT))) {
|
||||||
maxVarDataLen = pColVal->value.nData + sizeof(VarDataLenT);
|
maxVarDataLen = pColVal->value.nData + sizeof(VarDataLenT);
|
||||||
|
@ -680,9 +680,9 @@ int32_t tdSTSRowNew(SArray *pArray, STSchema *pTSchema, STSRow **ppRow) {
|
||||||
const void *val = NULL;
|
const void *val = NULL;
|
||||||
if (iColVal < nColVal) {
|
if (iColVal < nColVal) {
|
||||||
pColVal = (SColVal *)taosArrayGet(pArray, iColVal);
|
pColVal = (SColVal *)taosArrayGet(pArray, iColVal);
|
||||||
if (pColVal->isNone) {
|
if (COL_VAL_IS_NONE(pColVal)) {
|
||||||
valType = TD_VTYPE_NONE;
|
valType = TD_VTYPE_NONE;
|
||||||
} else if (pColVal->isNull) {
|
} else if (COL_VAL_IS_NULL(pColVal)) {
|
||||||
valType = TD_VTYPE_NULL;
|
valType = TD_VTYPE_NULL;
|
||||||
} else if (IS_VAR_DATA_TYPE(pTColumn->type)) {
|
} else if (IS_VAR_DATA_TYPE(pTColumn->type)) {
|
||||||
varDataSetLen(varBuf, pColVal->value.nData);
|
varDataSetLen(varBuf, pColVal->value.nData);
|
||||||
|
|
|
@ -133,11 +133,11 @@ static int32_t genTestData(const char **data, int16_t nCols, SArray **pArray) {
|
||||||
SColVal colVal = {0};
|
SColVal colVal = {0};
|
||||||
colVal.cid = PRIMARYKEY_TIMESTAMP_COL_ID + i;
|
colVal.cid = PRIMARYKEY_TIMESTAMP_COL_ID + i;
|
||||||
if (strncasecmp(data[i], NONE_CSTR, NONE_LEN) == 0) {
|
if (strncasecmp(data[i], NONE_CSTR, NONE_LEN) == 0) {
|
||||||
colVal.isNone = 1;
|
colVal.flag = CV_FLAG_NONE;
|
||||||
taosArrayPush(*pArray, &colVal);
|
taosArrayPush(*pArray, &colVal);
|
||||||
continue;
|
continue;
|
||||||
} else if (strncasecmp(data[i], NULL_CSTR, NULL_LEN) == 0) {
|
} else if (strncasecmp(data[i], NULL_CSTR, NULL_LEN) == 0) {
|
||||||
colVal.isNull = 1;
|
colVal.flag = CV_FLAG_NULL;
|
||||||
taosArrayPush(*pArray, &colVal);
|
taosArrayPush(*pArray, &colVal);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -204,11 +204,11 @@ static int32_t genTestData(const char **data, int16_t nCols, SArray **pArray) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t debugPrintSColVal(SColVal *cv, int8_t type) {
|
int32_t debugPrintSColVal(SColVal *cv, int8_t type) {
|
||||||
if (cv->isNone) {
|
if (COL_VAL_IS_NONE(cv)) {
|
||||||
printf("None ");
|
printf("None ");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (cv->isNull) {
|
if (COL_VAL_IS_NULL(cv)) {
|
||||||
printf("Null ");
|
printf("Null ");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -298,11 +298,11 @@ void debugPrintTSRow(STSRow2 *row, STSchema *pTSchema, const char *tags, int32_t
|
||||||
static int32_t checkSColVal(const char *rawVal, SColVal *cv, int8_t type) {
|
static int32_t checkSColVal(const char *rawVal, SColVal *cv, int8_t type) {
|
||||||
ASSERT(rawVal);
|
ASSERT(rawVal);
|
||||||
|
|
||||||
if (cv->isNone) {
|
if (COL_VAL_IS_NONE(cv)) {
|
||||||
EXPECT_STRCASEEQ(rawVal, NONE_CSTR);
|
EXPECT_STRCASEEQ(rawVal, NONE_CSTR);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (cv->isNull) {
|
if (COL_VAL_IS_NULL(cv)) {
|
||||||
EXPECT_STRCASEEQ(rawVal, NULL_CSTR);
|
EXPECT_STRCASEEQ(rawVal, NULL_CSTR);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -272,8 +272,8 @@ int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, STSRow *row, STsdb
|
||||||
|
|
||||||
SColVal colVal = {0};
|
SColVal colVal = {0};
|
||||||
tTSRowGetVal(row, pTSchema, iCol, &colVal);
|
tTSRowGetVal(row, pTSchema, iCol, &colVal);
|
||||||
if (colVal.isNone || colVal.isNull) {
|
if (!COL_VAL_IS_VALUE(&colVal)) {
|
||||||
if (keyTs == tTsVal1->ts && !tColVal->isNone && !tColVal->isNull) {
|
if (keyTs == tTsVal1->ts && COL_VAL_IS_VALUE(tColVal)) {
|
||||||
invalidate = true;
|
invalidate = true;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -1062,7 +1062,7 @@ static int32_t mergeLastRow(tb_uid_t uid, STsdb *pTsdb, bool *dup, STSRow **ppRo
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pColVal->isNone && !setNoneCol) {
|
if (COL_VAL_IS_NONE(pColVal) && !setNoneCol) {
|
||||||
noneCol = iCol;
|
noneCol = iCol;
|
||||||
setNoneCol = true;
|
setNoneCol = true;
|
||||||
}
|
}
|
||||||
|
@ -1087,9 +1087,9 @@ static int32_t mergeLastRow(tb_uid_t uid, STsdb *pTsdb, bool *dup, STSRow **ppRo
|
||||||
SColVal *tColVal = (SColVal *)taosArrayGet(pColArray, iCol);
|
SColVal *tColVal = (SColVal *)taosArrayGet(pColArray, iCol);
|
||||||
|
|
||||||
tsdbRowGetColVal(pRow, pTSchema, iCol, pColVal);
|
tsdbRowGetColVal(pRow, pTSchema, iCol, pColVal);
|
||||||
if (tColVal->isNone && !pColVal->isNone) {
|
if (COL_VAL_IS_NONE(tColVal) && !COL_VAL_IS_NONE(pColVal)) {
|
||||||
taosArraySet(pColArray, iCol, pColVal);
|
taosArraySet(pColArray, iCol, pColVal);
|
||||||
} else if (tColVal->isNone && pColVal->isNone && !setNoneCol) {
|
} else if (COL_VAL_IS_NONE(tColVal) && COL_VAL_IS_NONE(pColVal) && !setNoneCol) {
|
||||||
noneCol = iCol;
|
noneCol = iCol;
|
||||||
setNoneCol = true;
|
setNoneCol = true;
|
||||||
}
|
}
|
||||||
|
@ -1161,7 +1161,7 @@ static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray) {
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((pColVal->isNone || pColVal->isNull) && !setNoneCol) {
|
if (!COL_VAL_IS_VALUE(pColVal) && !setNoneCol) {
|
||||||
noneCol = iCol;
|
noneCol = iCol;
|
||||||
setNoneCol = true;
|
setNoneCol = true;
|
||||||
}
|
}
|
||||||
|
@ -1181,9 +1181,9 @@ static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray) {
|
||||||
SColVal *tColVal = (SColVal *)taosArrayGet(pColArray, iCol);
|
SColVal *tColVal = (SColVal *)taosArrayGet(pColArray, iCol);
|
||||||
|
|
||||||
tsdbRowGetColVal(pRow, pTSchema, iCol, pColVal);
|
tsdbRowGetColVal(pRow, pTSchema, iCol, pColVal);
|
||||||
if ((tColVal->isNone || tColVal->isNull) && (!pColVal->isNone && !pColVal->isNull)) {
|
if (!COL_VAL_IS_VALUE(tColVal) && COL_VAL_IS_VALUE(pColVal)) {
|
||||||
taosArraySet(pColArray, iCol, &(SLastCol){.ts = rowTs, .colVal = *pColVal});
|
taosArraySet(pColArray, iCol, &(SLastCol){.ts = rowTs, .colVal = *pColVal});
|
||||||
} else if ((tColVal->isNone || tColVal->isNull) && (pColVal->isNone || pColVal->isNull) && !setNoneCol) {
|
} else if (!COL_VAL_IS_VALUE(tColVal) && !COL_VAL_IS_VALUE(pColVal) && !setNoneCol) {
|
||||||
noneCol = iCol;
|
noneCol = iCol;
|
||||||
setNoneCol = true;
|
setNoneCol = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,7 @@ static void saveOneRow(STSRow* pRow, SSDataBlock* pBlock, SCacheRowsReader* pRea
|
||||||
tTSRowGetVal(pRow, pReader->pSchema, slotId, &colVal);
|
tTSRowGetVal(pRow, pReader->pSchema, slotId, &colVal);
|
||||||
|
|
||||||
if (IS_VAR_DATA_TYPE(colVal.type)) {
|
if (IS_VAR_DATA_TYPE(colVal.type)) {
|
||||||
if (colVal.isNull || colVal.isNone) {
|
if (!COL_VAL_IS_VALUE(&colVal)) {
|
||||||
colDataAppendNULL(pColInfoData, numOfRows);
|
colDataAppendNULL(pColInfoData, numOfRows);
|
||||||
} else {
|
} else {
|
||||||
varDataSetLen(pReader->transferBuf[slotId], colVal.value.nData);
|
varDataSetLen(pReader->transferBuf[slotId], colVal.value.nData);
|
||||||
|
@ -53,7 +53,7 @@ static void saveOneRow(STSRow* pRow, SSDataBlock* pBlock, SCacheRowsReader* pRea
|
||||||
colDataAppend(pColInfoData, numOfRows, pReader->transferBuf[slotId], false);
|
colDataAppend(pColInfoData, numOfRows, pReader->transferBuf[slotId], false);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
colDataAppend(pColInfoData, numOfRows, (const char*)&colVal.value, colVal.isNull || colVal.isNone);
|
colDataAppend(pColInfoData, numOfRows, (const char*)&colVal.value, !COL_VAL_IS_VALUE(&colVal));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -84,7 +84,7 @@ int32_t tsdbCacherowsReaderOpen(void* pVnode, int32_t type, SArray* pTableIdList
|
||||||
|
|
||||||
p->transferBuf = taosMemoryCalloc(p->pSchema->numOfCols, POINTER_BYTES);
|
p->transferBuf = taosMemoryCalloc(p->pSchema->numOfCols, POINTER_BYTES);
|
||||||
if (p->transferBuf == NULL) {
|
if (p->transferBuf == NULL) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < p->pSchema->numOfCols; ++i) {
|
for (int32_t i = 0; i < p->pSchema->numOfCols; ++i) {
|
||||||
|
@ -117,7 +117,8 @@ int32_t tsdbCacherowsReaderClose(void* pReader) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t doExtractCacheRow(SCacheRowsReader* pr, SLRUCache* lruCache, uint64_t uid, STSRow** pRow, LRUHandle** h) {
|
static int32_t doExtractCacheRow(SCacheRowsReader* pr, SLRUCache* lruCache, uint64_t uid, STSRow** pRow,
|
||||||
|
LRUHandle** h) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
if ((pr->type & CACHESCAN_RETRIEVE_LAST_ROW) == CACHESCAN_RETRIEVE_LAST_ROW) {
|
if ((pr->type & CACHESCAN_RETRIEVE_LAST_ROW) == CACHESCAN_RETRIEVE_LAST_ROW) {
|
||||||
code = tsdbCacheGetLastrowH(lruCache, uid, pr->pVnode->pTsdb, h);
|
code = tsdbCacheGetLastrowH(lruCache, uid, pr->pVnode->pTsdb, h);
|
||||||
|
@ -166,7 +167,7 @@ int32_t tsdbRetrieveCacheRows(void* pReader, SSDataBlock* pResBlock, const int32
|
||||||
STableKeyInfo* pKeyInfo = taosArrayGet(pr->pTableList, i);
|
STableKeyInfo* pKeyInfo = taosArrayGet(pr->pTableList, i);
|
||||||
|
|
||||||
code = doExtractCacheRow(pr, lruCache, pKeyInfo->uid, &pRow, &h);
|
code = doExtractCacheRow(pr, lruCache, pKeyInfo->uid, &pRow, &h);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -194,7 +195,7 @@ int32_t tsdbRetrieveCacheRows(void* pReader, SSDataBlock* pResBlock, const int32
|
||||||
for (int32_t i = pr->tableIndex; i < numOfTables; ++i) {
|
for (int32_t i = pr->tableIndex; i < numOfTables; ++i) {
|
||||||
STableKeyInfo* pKeyInfo = taosArrayGet(pr->pTableList, i);
|
STableKeyInfo* pKeyInfo = taosArrayGet(pr->pTableList, i);
|
||||||
code = doExtractCacheRow(pr, lruCache, pKeyInfo->uid, &pRow, &h);
|
code = doExtractCacheRow(pr, lruCache, pKeyInfo->uid, &pRow, &h);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -662,7 +662,7 @@ static void setBlockAllDumped(SFileBlockDumpInfo* pDumpInfo, int64_t maxKey, int
|
||||||
static void doCopyColVal(SColumnInfoData* pColInfoData, int32_t rowIndex, int32_t colIndex, SColVal* pColVal,
|
static void doCopyColVal(SColumnInfoData* pColInfoData, int32_t rowIndex, int32_t colIndex, SColVal* pColVal,
|
||||||
SBlockLoadSuppInfo* pSup) {
|
SBlockLoadSuppInfo* pSup) {
|
||||||
if (IS_VAR_DATA_TYPE(pColVal->type)) {
|
if (IS_VAR_DATA_TYPE(pColVal->type)) {
|
||||||
if (pColVal->isNull || pColVal->isNone) {
|
if (!COL_VAL_IS_VALUE(pColVal)) {
|
||||||
colDataAppendNULL(pColInfoData, rowIndex);
|
colDataAppendNULL(pColInfoData, rowIndex);
|
||||||
} else {
|
} else {
|
||||||
varDataSetLen(pSup->buildBuf[colIndex], pColVal->value.nData);
|
varDataSetLen(pSup->buildBuf[colIndex], pColVal->value.nData);
|
||||||
|
@ -671,7 +671,7 @@ static void doCopyColVal(SColumnInfoData* pColInfoData, int32_t rowIndex, int32_
|
||||||
colDataAppend(pColInfoData, rowIndex, pSup->buildBuf[colIndex], false);
|
colDataAppend(pColInfoData, rowIndex, pSup->buildBuf[colIndex], false);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
colDataAppend(pColInfoData, rowIndex, (const char*)&pColVal->value, pColVal->isNull || pColVal->isNone);
|
colDataAppend(pColInfoData, rowIndex, (const char*)&pColVal->value, !COL_VAL_IS_VALUE(pColVal));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -760,51 +760,43 @@ static int doBinarySearchKey(TSKEY* keyList, int num, int pos, TSKEY key, int or
|
||||||
s = pos;
|
s = pos;
|
||||||
|
|
||||||
// check
|
// check
|
||||||
assert(pos >=0 && pos < num);
|
assert(pos >= 0 && pos < num);
|
||||||
assert(num > 0);
|
assert(num > 0);
|
||||||
|
|
||||||
if (order == TSDB_ORDER_ASC) {
|
if (order == TSDB_ORDER_ASC) {
|
||||||
// find the first position which is smaller than the key
|
// find the first position which is smaller than the key
|
||||||
e = num - 1;
|
e = num - 1;
|
||||||
if (key < keyList[pos])
|
if (key < keyList[pos]) return -1;
|
||||||
return -1;
|
|
||||||
while (1) {
|
while (1) {
|
||||||
// check can return
|
// check can return
|
||||||
if (key >= keyList[e])
|
if (key >= keyList[e]) return e;
|
||||||
return e;
|
if (key <= keyList[s]) return s;
|
||||||
if (key <= keyList[s])
|
if (e - s <= 1) return s;
|
||||||
return s;
|
|
||||||
if (e - s <= 1)
|
|
||||||
return s;
|
|
||||||
|
|
||||||
// change start or end position
|
// change start or end position
|
||||||
int mid = s + (e - s + 1)/2;
|
int mid = s + (e - s + 1) / 2;
|
||||||
if (keyList[mid] > key)
|
if (keyList[mid] > key)
|
||||||
e = mid;
|
e = mid;
|
||||||
else if(keyList[mid] < key)
|
else if (keyList[mid] < key)
|
||||||
s = mid;
|
s = mid;
|
||||||
else
|
else
|
||||||
return mid;
|
return mid;
|
||||||
}
|
}
|
||||||
} else { // DESC
|
} else { // DESC
|
||||||
// find the first position which is bigger than the key
|
// find the first position which is bigger than the key
|
||||||
e = 0;
|
e = 0;
|
||||||
if (key > keyList[pos])
|
if (key > keyList[pos]) return -1;
|
||||||
return -1;
|
|
||||||
while (1) {
|
while (1) {
|
||||||
// check can return
|
// check can return
|
||||||
if (key <= keyList[e])
|
if (key <= keyList[e]) return e;
|
||||||
return e;
|
if (key >= keyList[s]) return s;
|
||||||
if (key >= keyList[s])
|
if (s - e <= 1) return s;
|
||||||
return s;
|
|
||||||
if (s - e <= 1)
|
|
||||||
return s;
|
|
||||||
|
|
||||||
// change start or end position
|
// change start or end position
|
||||||
int mid = s - (s - e + 1)/2;
|
int mid = s - (s - e + 1) / 2;
|
||||||
if (keyList[mid] < key)
|
if (keyList[mid] < key)
|
||||||
e = mid;
|
e = mid;
|
||||||
else if(keyList[mid] > key)
|
else if (keyList[mid] > key)
|
||||||
s = mid;
|
s = mid;
|
||||||
else
|
else
|
||||||
return mid;
|
return mid;
|
||||||
|
@ -815,7 +807,7 @@ static int doBinarySearchKey(TSKEY* keyList, int num, int pos, TSKEY key, int or
|
||||||
int32_t getEndPosInDataBlock(STsdbReader* pReader, SBlockData* pBlockData, SDataBlk* pBlock, int32_t pos) {
|
int32_t getEndPosInDataBlock(STsdbReader* pReader, SBlockData* pBlockData, SDataBlk* pBlock, int32_t pos) {
|
||||||
// NOTE: reverse the order to find the end position in data block
|
// NOTE: reverse the order to find the end position in data block
|
||||||
int32_t endPos = -1;
|
int32_t endPos = -1;
|
||||||
bool asc = ASCENDING_TRAVERSE(pReader->order);
|
bool asc = ASCENDING_TRAVERSE(pReader->order);
|
||||||
|
|
||||||
if (asc && pReader->window.ekey >= pBlock->maxKey.ts) {
|
if (asc && pReader->window.ekey >= pBlock->maxKey.ts) {
|
||||||
endPos = pBlock->nRow - 1;
|
endPos = pBlock->nRow - 1;
|
||||||
|
@ -851,8 +843,8 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn
|
||||||
} else if (!asc && pReader->window.ekey >= pBlock->maxKey.ts) {
|
} else if (!asc && pReader->window.ekey >= pBlock->maxKey.ts) {
|
||||||
pDumpInfo->rowIndex = pBlock->nRow - 1;
|
pDumpInfo->rowIndex = pBlock->nRow - 1;
|
||||||
} else {
|
} else {
|
||||||
int32_t pos = asc? pBlock->nRow-1:0;
|
int32_t pos = asc ? pBlock->nRow - 1 : 0;
|
||||||
int32_t order = (pReader->order == TSDB_ORDER_ASC)? TSDB_ORDER_DESC:TSDB_ORDER_ASC;
|
int32_t order = (pReader->order == TSDB_ORDER_ASC) ? TSDB_ORDER_DESC : TSDB_ORDER_ASC;
|
||||||
pDumpInfo->rowIndex = doBinarySearchKey(pBlockData->aTSKEY, pBlock->nRow, pos, pReader->window.skey, order);
|
pDumpInfo->rowIndex = doBinarySearchKey(pBlockData->aTSKEY, pBlock->nRow, pos, pReader->window.skey, order);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -865,13 +857,13 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn
|
||||||
|
|
||||||
endIndex += step;
|
endIndex += step;
|
||||||
int32_t remain = asc ? (endIndex - pDumpInfo->rowIndex) : (pDumpInfo->rowIndex - endIndex);
|
int32_t remain = asc ? (endIndex - pDumpInfo->rowIndex) : (pDumpInfo->rowIndex - endIndex);
|
||||||
if (remain > pReader->capacity) { // output buffer check
|
if (remain > pReader->capacity) { // output buffer check
|
||||||
remain = pReader->capacity;
|
remain = pReader->capacity;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t rowIndex = 0;
|
int32_t rowIndex = 0;
|
||||||
|
|
||||||
int32_t i = 0;
|
int32_t i = 0;
|
||||||
SColumnInfoData* pColData = taosArrayGet(pResBlock->pDataBlock, i);
|
SColumnInfoData* pColData = taosArrayGet(pResBlock->pDataBlock, i);
|
||||||
if (pColData->info.colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
|
if (pColData->info.colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
|
||||||
if (asc) {
|
if (asc) {
|
||||||
|
@ -895,7 +887,7 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn
|
||||||
if (pData->cid < pColData->info.colId) {
|
if (pData->cid < pColData->info.colId) {
|
||||||
colIndex += 1;
|
colIndex += 1;
|
||||||
} else if (pData->cid == pColData->info.colId) {
|
} else if (pData->cid == pColData->info.colId) {
|
||||||
if (pData->flag == HAS_NONE || pData->flag == HAS_NULL || pData->flag == (HAS_NULL|HAS_NONE)) {
|
if (pData->flag == HAS_NONE || pData->flag == HAS_NULL || pData->flag == (HAS_NULL | HAS_NONE)) {
|
||||||
colDataAppendNNULL(pColData, 0, remain);
|
colDataAppendNNULL(pColData, 0, remain);
|
||||||
} else {
|
} else {
|
||||||
if (IS_NUMERIC_TYPE(pColData->info.type) && asc) {
|
if (IS_NUMERIC_TYPE(pColData->info.type) && asc) {
|
||||||
|
@ -940,7 +932,7 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn
|
||||||
int64_t ts = pBlockData->aTSKEY[pDumpInfo->rowIndex];
|
int64_t ts = pBlockData->aTSKEY[pDumpInfo->rowIndex];
|
||||||
setBlockAllDumped(pDumpInfo, ts, pReader->order);
|
setBlockAllDumped(pDumpInfo, ts, pReader->order);
|
||||||
} else {
|
} else {
|
||||||
int64_t k = asc? pBlock->maxKey.ts:pBlock->minKey.ts;
|
int64_t k = asc ? pBlock->maxKey.ts : pBlock->minKey.ts;
|
||||||
setBlockAllDumped(pDumpInfo, k, pReader->order);
|
setBlockAllDumped(pDumpInfo, k, pReader->order);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -950,8 +942,8 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn
|
||||||
int32_t unDumpedRows = asc ? pBlock->nRow - pDumpInfo->rowIndex : pDumpInfo->rowIndex + 1;
|
int32_t unDumpedRows = asc ? pBlock->nRow - pDumpInfo->rowIndex : pDumpInfo->rowIndex + 1;
|
||||||
tsdbDebug("%p copy file block to sdatablock, global index:%d, table index:%d, brange:%" PRId64 "-%" PRId64
|
tsdbDebug("%p copy file block to sdatablock, global index:%d, table index:%d, brange:%" PRId64 "-%" PRId64
|
||||||
", rows:%d, remain:%d, minVer:%" PRId64 ", maxVer:%" PRId64 ", elapsed time:%.2f ms, %s",
|
", rows:%d, remain:%d, minVer:%" PRId64 ", maxVer:%" PRId64 ", elapsed time:%.2f ms, %s",
|
||||||
pReader, pBlockIter->index, pBlockInfo->tbBlockIdx, pBlock->minKey.ts, pBlock->maxKey.ts, remain, unDumpedRows,
|
pReader, pBlockIter->index, pBlockInfo->tbBlockIdx, pBlock->minKey.ts, pBlock->maxKey.ts, remain,
|
||||||
pBlock->minVer, pBlock->maxVer, elapsedTime, pReader->idStr);
|
unDumpedRows, pBlock->minVer, pBlock->maxVer, elapsedTime, pReader->idStr);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -1287,14 +1279,14 @@ static bool doCheckforDatablockOverlap(STableBlockScanInfo* pBlockScanInfo, cons
|
||||||
if (p->version >= pBlock->minVer) {
|
if (p->version >= pBlock->minVer) {
|
||||||
if (i < num - 1) {
|
if (i < num - 1) {
|
||||||
TSDBKEY* pnext = taosArrayGet(pBlockScanInfo->delSkyline, i + 1);
|
TSDBKEY* pnext = taosArrayGet(pBlockScanInfo->delSkyline, i + 1);
|
||||||
// if (i + 1 == num - 1) { // pnext is the last point
|
// if (i + 1 == num - 1) { // pnext is the last point
|
||||||
if (pnext->ts >= pBlock->minKey.ts) {
|
if (pnext->ts >= pBlock->minKey.ts) {
|
||||||
return true;
|
return true;
|
||||||
// }
|
// }
|
||||||
// } else {
|
// } else {
|
||||||
// if (pnext->ts >= pBlock->minKey.ts) {
|
// if (pnext->ts >= pBlock->minKey.ts) {
|
||||||
// return true;
|
// return true;
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
} else { // it must be the last point
|
} else { // it must be the last point
|
||||||
ASSERT(p->version == 0);
|
ASSERT(p->version == 0);
|
||||||
|
@ -1755,7 +1747,7 @@ static int32_t doMergeMultiLevelRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
tsLast = getCurrentKeyInLastBlock(pLastBlockReader);
|
tsLast = getCurrentKeyInLastBlock(pLastBlockReader);
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t key = hasDataInFileBlock(pBlockData, pDumpInfo)? pBlockData->aTSKEY[pDumpInfo->rowIndex]:INT64_MIN;
|
int64_t key = hasDataInFileBlock(pBlockData, pDumpInfo) ? pBlockData->aTSKEY[pDumpInfo->rowIndex] : INT64_MIN;
|
||||||
|
|
||||||
TSDBKEY k = TSDBROW_KEY(pRow);
|
TSDBKEY k = TSDBROW_KEY(pRow);
|
||||||
TSDBKEY ik = TSDBROW_KEY(piRow);
|
TSDBKEY ik = TSDBROW_KEY(piRow);
|
||||||
|
@ -2023,12 +2015,12 @@ static int64_t getCurrentKeyInLastBlock(SLastBlockReader* pLastBlockReader) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool hasDataInLastBlock(SLastBlockReader* pLastBlockReader) { return pLastBlockReader->mergeTree.pIter != NULL; }
|
static bool hasDataInLastBlock(SLastBlockReader* pLastBlockReader) { return pLastBlockReader->mergeTree.pIter != NULL; }
|
||||||
bool hasDataInFileBlock(const SBlockData* pBlockData, const SFileBlockDumpInfo* pDumpInfo) {
|
bool hasDataInFileBlock(const SBlockData* pBlockData, const SFileBlockDumpInfo* pDumpInfo) {
|
||||||
if (pBlockData->nRow > 0) {
|
if (pBlockData->nRow > 0) {
|
||||||
ASSERT(pBlockData->nRow == pDumpInfo->totalRows);
|
ASSERT(pBlockData->nRow == pDumpInfo->totalRows);
|
||||||
}
|
}
|
||||||
|
|
||||||
return pBlockData->nRow > 0 && (!pDumpInfo->allDumped);
|
return pBlockData->nRow > 0 && (!pDumpInfo->allDumped);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t mergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pBlockScanInfo, int64_t key,
|
int32_t mergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pBlockScanInfo, int64_t key,
|
||||||
|
@ -2101,11 +2093,12 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) {
|
||||||
if (pBlockInfo != NULL) {
|
if (pBlockInfo != NULL) {
|
||||||
pBlockScanInfo = taosHashGet(pReader->status.pTableMap, &pBlockInfo->uid, sizeof(pBlockInfo->uid));
|
pBlockScanInfo = taosHashGet(pReader->status.pTableMap, &pBlockInfo->uid, sizeof(pBlockInfo->uid));
|
||||||
SDataBlk* pBlock = getCurrentBlock(&pReader->status.blockIter);
|
SDataBlk* pBlock = getCurrentBlock(&pReader->status.blockIter);
|
||||||
TSDBKEY keyInBuf = getCurrentKeyInBuf(pBlockScanInfo, pReader);
|
TSDBKEY keyInBuf = getCurrentKeyInBuf(pBlockScanInfo, pReader);
|
||||||
|
|
||||||
// it is a clean block, load it directly
|
// it is a clean block, load it directly
|
||||||
if (isCleanFileDataBlock(pReader, pBlockInfo, pBlock, pBlockScanInfo, keyInBuf, pLastBlockReader)) {
|
if (isCleanFileDataBlock(pReader, pBlockInfo, pBlock, pBlockScanInfo, keyInBuf, pLastBlockReader)) {
|
||||||
if (pReader->order == TSDB_ORDER_ASC || (pReader->order == TSDB_ORDER_DESC && (!hasDataInLastBlock(pLastBlockReader)))) {
|
if (pReader->order == TSDB_ORDER_ASC ||
|
||||||
|
(pReader->order == TSDB_ORDER_DESC && (!hasDataInLastBlock(pLastBlockReader)))) {
|
||||||
copyBlockDataToSDataBlock(pReader, pBlockScanInfo);
|
copyBlockDataToSDataBlock(pReader, pBlockScanInfo);
|
||||||
goto _end;
|
goto _end;
|
||||||
}
|
}
|
||||||
|
@ -2158,12 +2151,12 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_end:
|
_end:
|
||||||
pResBlock->info.uid = pBlockScanInfo->uid;
|
pResBlock->info.uid = pBlockScanInfo->uid;
|
||||||
blockDataUpdateTsWindow(pResBlock, 0);
|
blockDataUpdateTsWindow(pResBlock, 0);
|
||||||
|
|
||||||
setComposedBlockFlag(pReader, true);
|
setComposedBlockFlag(pReader, true);
|
||||||
double el = (taosGetTimestampUs() - st)/1000.0;
|
double el = (taosGetTimestampUs() - st) / 1000.0;
|
||||||
|
|
||||||
pReader->cost.composedBlocks += 1;
|
pReader->cost.composedBlocks += 1;
|
||||||
pReader->cost.buildComposedBlockTime += el;
|
pReader->cost.buildComposedBlockTime += el;
|
||||||
|
@ -3228,7 +3221,8 @@ int32_t doAppendRowFromFileBlock(SSDataBlock* pResBlock, STsdbReader* pReader, S
|
||||||
tColDataGetValue(pData, rowIndex, &cv);
|
tColDataGetValue(pData, rowIndex, &cv);
|
||||||
doCopyColVal(pCol, outputRowIndex, i, &cv, pSupInfo);
|
doCopyColVal(pCol, outputRowIndex, i, &cv, pSupInfo);
|
||||||
j += 1;
|
j += 1;
|
||||||
} else if (pData->cid > pCol->info.colId) { // the specified column does not exist in file block, fill with null data
|
} else if (pData->cid >
|
||||||
|
pCol->info.colId) { // the specified column does not exist in file block, fill with null data
|
||||||
colDataAppendNULL(pCol, outputRowIndex);
|
colDataAppendNULL(pCol, outputRowIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3302,7 +3296,6 @@ void* tsdbGetIvtIdx(SMeta* pMeta) {
|
||||||
|
|
||||||
uint64_t getReaderMaxVersion(STsdbReader* pReader) { return pReader->verRange.maxVer; }
|
uint64_t getReaderMaxVersion(STsdbReader* pReader) { return pReader->verRange.maxVer; }
|
||||||
|
|
||||||
|
|
||||||
static int32_t doOpenReaderImpl(STsdbReader* pReader) {
|
static int32_t doOpenReaderImpl(STsdbReader* pReader) {
|
||||||
SDataBlockIter* pBlockIter = &pReader->status.blockIter;
|
SDataBlockIter* pBlockIter = &pReader->status.blockIter;
|
||||||
|
|
||||||
|
@ -3375,19 +3368,20 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, SArray* pTabl
|
||||||
|
|
||||||
// NOTE: the endVersion in pCond is the data version not schema version, so pCond->endVersion is not correct here.
|
// NOTE: the endVersion in pCond is the data version not schema version, so pCond->endVersion is not correct here.
|
||||||
if (pCond->suid != 0) {
|
if (pCond->suid != 0) {
|
||||||
pReader->pSchema = metaGetTbTSchema(pReader->pTsdb->pVnode->pMeta, pReader->suid, -1);
|
pReader->pSchema = metaGetTbTSchema(pReader->pTsdb->pVnode->pMeta, pReader->suid, -1);
|
||||||
if (pReader->pSchema == NULL) {
|
if (pReader->pSchema == NULL) {
|
||||||
tsdbError("failed to get table schema, suid:%"PRIu64", ver:%"PRId64" , %s", pReader->suid, -1, pReader->idStr);
|
tsdbError("failed to get table schema, suid:%" PRIu64 ", ver:%" PRId64 " , %s", pReader->suid, -1,
|
||||||
|
pReader->idStr);
|
||||||
}
|
}
|
||||||
} else if (taosArrayGetSize(pTableList) > 0) {
|
} else if (taosArrayGetSize(pTableList) > 0) {
|
||||||
STableKeyInfo* pKey = taosArrayGet(pTableList, 0);
|
STableKeyInfo* pKey = taosArrayGet(pTableList, 0);
|
||||||
pReader->pSchema = metaGetTbTSchema(pReader->pTsdb->pVnode->pMeta, pKey->uid, -1);
|
pReader->pSchema = metaGetTbTSchema(pReader->pTsdb->pVnode->pMeta, pKey->uid, -1);
|
||||||
if (pReader->pSchema == NULL) {
|
if (pReader->pSchema == NULL) {
|
||||||
tsdbError("failed to get table schema, uid:%"PRIu64", ver:%"PRId64" , %s", pKey->uid, -1, pReader->idStr);
|
tsdbError("failed to get table schema, uid:%" PRIu64 ", ver:%" PRId64 " , %s", pKey->uid, -1, pReader->idStr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STsdbReader* p = pReader->innerReader[0] != NULL? pReader->innerReader[0]:pReader;
|
STsdbReader* p = pReader->innerReader[0] != NULL ? pReader->innerReader[0] : pReader;
|
||||||
|
|
||||||
int32_t numOfTables = taosArrayGetSize(pTableList);
|
int32_t numOfTables = taosArrayGetSize(pTableList);
|
||||||
pReader->status.pTableMap = createDataBlockScanInfo(p, pTableList->pData, numOfTables);
|
pReader->status.pTableMap = createDataBlockScanInfo(p, pTableList->pData, numOfTables);
|
||||||
|
@ -3507,7 +3501,8 @@ void tsdbReaderClose(STsdbReader* pReader) {
|
||||||
|
|
||||||
tsdbDebug(
|
tsdbDebug(
|
||||||
"%p :io-cost summary: head-file:%" PRIu64 ", head-file time:%.2f ms, SMA:%" PRId64
|
"%p :io-cost summary: head-file:%" PRIu64 ", head-file time:%.2f ms, SMA:%" PRId64
|
||||||
" SMA-time:%.2f ms, fileBlocks:%" PRId64 ", fileBlocks-load-time:%.2f ms, "
|
" SMA-time:%.2f ms, fileBlocks:%" PRId64
|
||||||
|
", fileBlocks-load-time:%.2f ms, "
|
||||||
"build in-memory-block-time:%.2f ms, lastBlocks:%" PRId64 ", lastBlocks-time:%.2f ms, composed-blocks:%" PRId64
|
"build in-memory-block-time:%.2f ms, lastBlocks:%" PRId64 ", lastBlocks-time:%.2f ms, composed-blocks:%" PRId64
|
||||||
", composed-blocks-time:%.2fms, STableBlockScanInfo size:%.2f Kb %s",
|
", composed-blocks-time:%.2fms, STableBlockScanInfo size:%.2f Kb %s",
|
||||||
pReader, pCost->headFileLoad, pCost->headFileLoadTime, pCost->smaDataLoad, pCost->smaLoadTime, pCost->numOfBlocks,
|
pReader, pCost->headFileLoad, pCost->headFileLoadTime, pCost->smaDataLoad, pCost->smaLoadTime, pCost->numOfBlocks,
|
||||||
|
@ -3765,8 +3760,10 @@ int32_t tsdbReaderReset(STsdbReader* pReader, SQueryTableDataCond* pCond) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tsdbDebug("%p reset reader, suid:%" PRIu64 ", numOfTables:%d, skey:%"PRId64", query range:%" PRId64 " - %" PRId64 " in query %s",
|
tsdbDebug("%p reset reader, suid:%" PRIu64 ", numOfTables:%d, skey:%" PRId64 ", query range:%" PRId64 " - %" PRId64
|
||||||
pReader, pReader->suid, numOfTables, pCond->twindows.skey, pReader->window.skey, pReader->window.ekey, pReader->idStr);
|
" in query %s",
|
||||||
|
pReader, pReader->suid, numOfTables, pCond->twindows.skey, pReader->window.skey, pReader->window.ekey,
|
||||||
|
pReader->idStr);
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
|
@ -705,12 +705,12 @@ int32_t tRowMergerAdd(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema) {
|
||||||
tsdbRowGetColVal(pRow, pTSchema, jCol++, pColVal);
|
tsdbRowGetColVal(pRow, pTSchema, jCol++, pColVal);
|
||||||
|
|
||||||
if (key.version > pMerger->version) {
|
if (key.version > pMerger->version) {
|
||||||
if (!pColVal->isNone) {
|
if (!COL_VAL_IS_NONE(pColVal)) {
|
||||||
taosArraySet(pMerger->pArray, iCol, pColVal);
|
taosArraySet(pMerger->pArray, iCol, pColVal);
|
||||||
}
|
}
|
||||||
} else if (key.version < pMerger->version) {
|
} else if (key.version < pMerger->version) {
|
||||||
SColVal *tColVal = (SColVal *)taosArrayGet(pMerger->pArray, iCol);
|
SColVal *tColVal = (SColVal *)taosArrayGet(pMerger->pArray, iCol);
|
||||||
if (tColVal->isNone && !pColVal->isNone) {
|
if (COL_VAL_IS_NONE(tColVal) && !COL_VAL_IS_NONE(pColVal)) {
|
||||||
taosArraySet(pMerger->pArray, iCol, pColVal);
|
taosArraySet(pMerger->pArray, iCol, pColVal);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -776,12 +776,12 @@ int32_t tRowMerge(SRowMerger *pMerger, TSDBROW *pRow) {
|
||||||
tsdbRowGetColVal(pRow, pMerger->pTSchema, iCol, pColVal);
|
tsdbRowGetColVal(pRow, pMerger->pTSchema, iCol, pColVal);
|
||||||
|
|
||||||
if (key.version > pMerger->version) {
|
if (key.version > pMerger->version) {
|
||||||
if (!pColVal->isNone) {
|
if (!COL_VAL_IS_NONE(pColVal)) {
|
||||||
taosArraySet(pMerger->pArray, iCol, pColVal);
|
taosArraySet(pMerger->pArray, iCol, pColVal);
|
||||||
}
|
}
|
||||||
} else if (key.version < pMerger->version) {
|
} else if (key.version < pMerger->version) {
|
||||||
SColVal *tColVal = (SColVal *)taosArrayGet(pMerger->pArray, iCol);
|
SColVal *tColVal = (SColVal *)taosArrayGet(pMerger->pArray, iCol);
|
||||||
if (tColVal->isNone && !pColVal->isNone) {
|
if (COL_VAL_IS_NONE(tColVal) && !COL_VAL_IS_NONE(pColVal)) {
|
||||||
taosArraySet(pMerger->pArray, iCol, pColVal);
|
taosArraySet(pMerger->pArray, iCol, pColVal);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -1505,7 +1505,7 @@ void tsdbCalcColDataSMA(SColData *pColData, SColumnDataAgg *pColAgg) {
|
||||||
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
tColDataGetValue(pColData, iVal, pColVal);
|
tColDataGetValue(pColData, iVal, pColVal);
|
||||||
|
|
||||||
if (pColVal->isNone || pColVal->isNull) {
|
if (!COL_VAL_IS_VALUE(pColVal)) {
|
||||||
pColAgg->numOfNull++;
|
pColAgg->numOfNull++;
|
||||||
} else {
|
} else {
|
||||||
switch (pColData->type) {
|
switch (pColData->type) {
|
||||||
|
|
|
@ -505,7 +505,7 @@ static int32_t tdBlockRowMerge(STableMeta* pTableMeta, SBlockKeyTuple* pEndKeyTp
|
||||||
SColVal colVal = {0};
|
SColVal colVal = {0};
|
||||||
for (int32_t j = 0; j < nDupRows; ++j) {
|
for (int32_t j = 0; j < nDupRows; ++j) {
|
||||||
tTSRowGetVal((pEndKeyTp - j)->payloadAddr, pSchema, i, &colVal);
|
tTSRowGetVal((pEndKeyTp - j)->payloadAddr, pSchema, i, &colVal);
|
||||||
if (!colVal.isNone) {
|
if (!COL_VAL_IS_NONE(&colVal)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue