From d32cf8bcb8cc81eef08528e2ef6386bdfea3baef Mon Sep 17 00:00:00 2001 From: Jinqing Kuang Date: Sat, 8 Feb 2025 17:32:25 +0800 Subject: [PATCH] fix(query)[TS-5984]. correct data block filtering logic in tsdbReader When scanning a table with a primary key, tsdbReader could load irrelevant data blocks outside the query time range, causing errors when returning results. This fix improves filtering logic to ensure only valid blocks are read and adds test verification. --- source/dnode/vnode/src/tsdb/tsdbRead2.c | 4 +++ tests/army/query/queryBugs.py | 40 +++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/source/dnode/vnode/src/tsdb/tsdbRead2.c b/source/dnode/vnode/src/tsdb/tsdbRead2.c index 4ca140c03e..57041e851a 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead2.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead2.c @@ -978,6 +978,10 @@ static int32_t loadFileBlockBrinInfo(STsdbReader* pReader, SArray* pIndexList, S if (pRecord->firstKey.key.ts > w.ekey || pRecord->lastKey.key.ts < w.skey) { continue; } + // The data block's time range must intersect with the query time range + if (pRecord->firstKey.key.ts > pReader->info.window.ekey || pRecord->lastKey.key.ts < pReader->info.window.skey) { + continue; + } if (asc) { if (pkCompEx(&pRecord->lastKey.key, &pScanInfo->lastProcKey) <= 0) { diff --git a/tests/army/query/queryBugs.py b/tests/army/query/queryBugs.py index 19459c9581..15a02b3475 100644 --- a/tests/army/query/queryBugs.py +++ b/tests/army/query/queryBugs.py @@ -170,6 +170,45 @@ class TDTestCase(TBase): tdSql.checkData(0, 1, 2) tdSql.checkData(2, 1, 1) + def FIX_TS_5984(self): + tdLog.info("check bug TS_5984 ...\n") + # prepare data + sqls = [ + "drop database if exists ts_5984;", + "create database ts_5984 minrows 10;", + "use ts_5984;", + "create table t1 (ts timestamp, str varchar(10) primary key, c1 int);", + """insert into t1 values + ('2025-01-01 00:00:00', 'a', 1), + ('2025-01-01 00:00:00', 'b', 2), + ('2025-01-01 00:00:00', 'c', 3), + ('2025-01-01 00:00:00', 'd', 4), + ('2025-01-01 00:00:00', 'e', 5), + ('2025-01-01 00:00:00', 'f', 6), + ('2025-01-01 00:00:00', 'g', 7), + ('2025-01-01 00:00:00', 'h', 8), + ('2025-01-01 00:00:00', 'i', 9), + ('2025-01-01 00:00:00', 'j', 10), + ('2025-01-01 00:00:00', 'k', 11), + ('2025-01-01 00:00:00', 'l', 12), + ('2025-01-01 00:00:00', 'm', 13), + ('2025-01-01 00:00:00', 'n', 14);""" + ] + tdSql.executes(sqls) + # do flush and compact + tdSql.execute("flush database ts_5984;") + time.sleep(3) + tdSql.execute("compact database ts_5984;") + while True: + tdSql.query("show compacts;") + # break if no compact task + if tdSql.getRows() == 0: + break + time.sleep(3) + + tdSql.query("select * from t1 where ts > '2025-01-01 00:00:00';") + tdSql.checkRows(0) + # run def run(self): tdLog.debug(f"start to excute {__file__}") @@ -182,6 +221,7 @@ class TDTestCase(TBase): self.FIX_TS_5105() self.FIX_TS_5143() self.FIX_TS_5239() + self.FIX_TS_5984() tdLog.success(f"{__file__} successfully executed")