Merge pull request #29129 from taosdata/fix/TD-33191

fix(tsdb/cache): fix invalid param caused by column mismatching
This commit is contained in:
Shengliang Guan 2024-12-16 19:04:56 +08:00 committed by GitHub
commit 7e2a6f1686
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 113 additions and 14 deletions

View File

@ -1757,34 +1757,31 @@ static int32_t tsdbCacheLoadFromRaw(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArr
int32_t code = 0, lino = 0;
rocksdb_writebatch_t *wb = NULL;
SArray *pTmpColArray = NULL;
bool extraTS = false;
SIdxKey *idxKey = taosArrayGet(remainCols, 0);
if (idxKey->key.cid != PRIMARYKEY_TIMESTAMP_COL_ID) {
// ignore 'ts' loaded from cache and load it from tsdb
SLastCol *pLastCol = taosArrayGet(pLastArray, 0);
tsdbCacheUpdateLastColToNone(pLastCol, TSDB_LAST_CACHE_NO_CACHE);
// SLastCol *pLastCol = taosArrayGet(pLastArray, 0);
// tsdbCacheUpdateLastColToNone(pLastCol, TSDB_LAST_CACHE_NO_CACHE);
SLastKey *key = &(SLastKey){.lflag = ltype, .uid = uid, .cid = PRIMARYKEY_TIMESTAMP_COL_ID};
if (!taosArrayInsert(remainCols, 0, &(SIdxKey){0, *key})) {
TAOS_RETURN(terrno);
}
extraTS = true;
}
int num_keys = TARRAY_SIZE(remainCols);
int16_t *slotIds = taosMemoryMalloc(num_keys * sizeof(int16_t));
int16_t *lastColIds = NULL;
int16_t *lastSlotIds = NULL;
int16_t *lastrowColIds = NULL;
int16_t *lastrowSlotIds = NULL;
int16_t *lastColIds = NULL, *lastSlotIds = NULL, *lastrowColIds = NULL, *lastrowSlotIds = NULL;
lastColIds = taosMemoryMalloc(num_keys * sizeof(int16_t));
lastSlotIds = taosMemoryMalloc(num_keys * sizeof(int16_t));
lastrowColIds = taosMemoryMalloc(num_keys * sizeof(int16_t));
lastrowSlotIds = taosMemoryMalloc(num_keys * sizeof(int16_t));
SArray *lastTmpColArray = NULL;
SArray *lastTmpIndexArray = NULL;
SArray *lastrowTmpColArray = NULL;
SArray *lastrowTmpIndexArray = NULL;
SArray *lastTmpColArray = NULL, *lastTmpIndexArray = NULL, *lastrowTmpColArray = NULL, *lastrowTmpIndexArray = NULL;
int lastIndex = 0;
int lastrowIndex = 0;
@ -1795,7 +1792,12 @@ static int32_t tsdbCacheLoadFromRaw(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArr
for (int i = 0; i < num_keys; ++i) {
SIdxKey *idxKey = taosArrayGet(remainCols, i);
slotIds[i] = pr->pSlotIds[idxKey->idx];
if (extraTS && !i) {
slotIds[i] = 0;
} else {
slotIds[i] = pr->pSlotIds[idxKey->idx];
}
if (IS_LAST_KEY(idxKey->key)) {
if (NULL == lastTmpIndexArray) {
lastTmpIndexArray = taosArrayInit(num_keys, sizeof(int32_t));
@ -1807,7 +1809,11 @@ static int32_t tsdbCacheLoadFromRaw(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArr
TAOS_CHECK_EXIT(terrno);
}
lastColIds[lastIndex] = idxKey->key.cid;
lastSlotIds[lastIndex] = pr->pSlotIds[idxKey->idx];
if (extraTS && !i) {
lastSlotIds[lastIndex] = 0;
} else {
lastSlotIds[lastIndex] = pr->pSlotIds[idxKey->idx];
}
lastIndex++;
} else {
if (NULL == lastrowTmpIndexArray) {
@ -1820,7 +1826,11 @@ static int32_t tsdbCacheLoadFromRaw(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArr
TAOS_CHECK_EXIT(terrno);
}
lastrowColIds[lastrowIndex] = idxKey->key.cid;
lastrowSlotIds[lastrowIndex] = pr->pSlotIds[idxKey->idx];
if (extraTS && !i) {
lastrowSlotIds[lastrowIndex] = 0;
} else {
lastrowSlotIds[lastrowIndex] = pr->pSlotIds[idxKey->idx];
}
lastrowIndex++;
}
}
@ -1867,7 +1877,9 @@ static int32_t tsdbCacheLoadFromRaw(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArr
pLastCol = &noneCol;
}
taosArraySet(pLastArray, idxKey->idx, pLastCol);
if (!extraTS || i > 0) {
taosArraySet(pLastArray, idxKey->idx, pLastCol);
}
// taosArrayRemove(remainCols, i);
if (/*!pTmpColArray*/ lastTmpIndexArray && !lastTmpColArray) {

View File

@ -145,6 +145,7 @@ sql alter database $db cachemodel 'both'
sql alter database $db cachesize 2
sleep 11000
run tsim/parser/last_both_no_ts.tsim
run tsim/parser/last_both_query.sim
system sh/exec.sh -n dnode1 -s stop -x SIGINT

View File

@ -0,0 +1,86 @@
$db = testdb
sql use $db
print "test tb1"
sql select last_row(f1, f2, f3, f4) from st2
if $rows != 1 then
return -1
endi
if $data00 != 6 then
return -1
endi
if $data01 != NULL then
print expect NULL actual: $data02
return -1
endi
if $data02 != NULL then
print expect NULL actual: $data02
return -1
endi
if $data03 != @70-01-01 07:59:57.000@ then
return -1
endi
sql select last_row(*) from st2
if $rows != 1 then
return -1
endi
if $data00 != @21-05-12 10:10:12.000@ then
print $data00
return -1
endi
if $data01 != 6 then
return -1
endi
if $data02 != NULL then
print expect NULL actual: $data02
return -1
endi
if $data03 != NULL then
print expect NULL actual: $data02
return -1
endi
if $data04 != @70-01-01 07:59:57.000@ then
return -1
endi
sql select last(f1, f2, f3, f4) from st2
if $rows != 1 then
return -1
endi
if $data00 != 6 then
return -1
endi
if $data01 != 37.000000000 then
print expect 37.000000000 actual: $data02
return -1
endi
if $data02 != 27 then
return -1
endi
if $data03 != @70-01-01 07:59:57.000@ then
return -1
endi
sql select last(*) from st2
if $rows != 1 then
return -1
endi
if $data00 != @21-05-12 10:10:12.000@ then
print $data00
return -1
endi
if $data01 != 6 then
return -1
endi
if $data02 != 37.000000000 then
print expect 37.000000000 actual: $data02
return -1
endi
if $data03 != 27 then
return -1
endi
if $data04 != @70-01-01 07:59:57.000@ then
return -1
endi