diff --git a/src/mito2/src/read/last_row.rs b/src/mito2/src/read/last_row.rs index 40767bc483..f40172c21d 100644 --- a/src/mito2/src/read/last_row.rs +++ b/src/mito2/src/read/last_row.rs @@ -213,6 +213,10 @@ impl RowGroupLastRowReader { /// Updates row group's last row cache if cache manager is present. fn maybe_update_cache(&mut self) { if let Some(cache) = &self.cache_manager { + if self.yielded_batches.is_empty() { + // we always expect that row groups yields batches. + return; + } let value = Arc::new(SelectorResultValue { result: std::mem::take(&mut self.yielded_batches), projection: self diff --git a/tests/cases/standalone/common/select/last_value.result b/tests/cases/standalone/common/select/last_value.result new file mode 100644 index 0000000000..d078e0aa36 --- /dev/null +++ b/tests/cases/standalone/common/select/last_value.result @@ -0,0 +1,69 @@ +create table t ( + ts timestamp time index, + host string primary key, + not_pk string, + val double, +) with (append_mode='true'); + +Affected Rows: 0 + +insert into t values + (0, 'a', '🌕', 1.0), + (1, 'b', '🌖', 2.0), + (2, 'a', '🌗', 3.0), + (3, 'c', '🌘', 4.0), + (4, 'a', '🌑', 5.0), + (5, 'b', '🌒', 6.0), + (6, 'a', '🌓', 7.0), + (7, 'c', '🌔', 8.0), + (8, 'd', '🌕', 9.0); + +Affected Rows: 9 + +admin flush_table('t'); + ++------------------------+ +| ADMIN flush_table('t') | ++------------------------+ +| 0 | ++------------------------+ + +select + last_value(host order by ts), + last_value(not_pk order by ts), + last_value(val order by ts) +from t + group by host + order by host; + ++---------------------------------------------------+-----------------------------------------------------+--------------------------------------------------+ +| last_value(t.host) ORDER BY [t.ts ASC NULLS LAST] | last_value(t.not_pk) ORDER BY [t.ts ASC NULLS LAST] | last_value(t.val) ORDER BY [t.ts ASC NULLS LAST] | ++---------------------------------------------------+-----------------------------------------------------+--------------------------------------------------+ +| a | 🌓 | 7.0 | +| b | 🌒 | 6.0 | +| c | 🌔 | 8.0 | +| d | 🌕 | 9.0 | ++---------------------------------------------------+-----------------------------------------------------+--------------------------------------------------+ + +-- repeat the query again, ref: https://github.com/GreptimeTeam/greptimedb/issues/4650 +select + last_value(host order by ts), + last_value(not_pk order by ts), + last_value(val order by ts) +from t + group by host + order by host; + ++---------------------------------------------------+-----------------------------------------------------+--------------------------------------------------+ +| last_value(t.host) ORDER BY [t.ts ASC NULLS LAST] | last_value(t.not_pk) ORDER BY [t.ts ASC NULLS LAST] | last_value(t.val) ORDER BY [t.ts ASC NULLS LAST] | ++---------------------------------------------------+-----------------------------------------------------+--------------------------------------------------+ +| a | 🌓 | 7.0 | +| b | 🌒 | 6.0 | +| c | 🌔 | 8.0 | +| d | 🌕 | 9.0 | ++---------------------------------------------------+-----------------------------------------------------+--------------------------------------------------+ + +drop table t; + +Affected Rows: 0 + diff --git a/tests/cases/standalone/common/select/last_value.sql b/tests/cases/standalone/common/select/last_value.sql new file mode 100644 index 0000000000..969c2ce1a1 --- /dev/null +++ b/tests/cases/standalone/common/select/last_value.sql @@ -0,0 +1,38 @@ +create table t ( + ts timestamp time index, + host string primary key, + not_pk string, + val double, +) with (append_mode='true'); + +insert into t values + (0, 'a', '🌕', 1.0), + (1, 'b', '🌖', 2.0), + (2, 'a', '🌗', 3.0), + (3, 'c', '🌘', 4.0), + (4, 'a', '🌑', 5.0), + (5, 'b', '🌒', 6.0), + (6, 'a', '🌓', 7.0), + (7, 'c', '🌔', 8.0), + (8, 'd', '🌕', 9.0); + +admin flush_table('t'); + +select + last_value(host order by ts), + last_value(not_pk order by ts), + last_value(val order by ts) +from t + group by host + order by host; + +-- repeat the query again, ref: https://github.com/GreptimeTeam/greptimedb/issues/4650 +select + last_value(host order by ts), + last_value(not_pk order by ts), + last_value(val order by ts) +from t + group by host + order by host; + +drop table t;