Skip to content

Commit

Permalink
fix(mito): avoid caching empty batches in row group (GreptimeTeam#4652)
Browse files Browse the repository at this point in the history
* fix: avoid caching empty batches in row group

* fix: clippy

* Update tests/cases/standalone/common/select/last_value.sql

* fix: sqlness
  • Loading branch information
v0y4g3r authored and CookiePieWw committed Sep 17, 2024
1 parent 00481a1 commit 4dd912c
Show file tree
Hide file tree
Showing 3 changed files with 111 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/mito2/src/read/last_row.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
69 changes: 69 additions & 0 deletions tests/cases/standalone/common/select/last_value.result
Original file line number Diff line number Diff line change
@@ -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

38 changes: 38 additions & 0 deletions tests/cases/standalone/common/select/last_value.sql
Original file line number Diff line number Diff line change
@@ -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;

0 comments on commit 4dd912c

Please sign in to comment.