Skip to content

Commit 5ca9e64

Browse files
authored
chore(query): fix topk in native (#17003)
* chore(query): fix topk in native * chore(query): fix topk in native
1 parent fd8b259 commit 5ca9e64

File tree

4 files changed

+62
-57
lines changed

4 files changed

+62
-57
lines changed

scripts/setup/rust-tools.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
22
3-
4-
taplo-cli@0.8.1
5-
typos-cli@1.17.2
3+
4+
taplo-cli@0.9.3
5+
typos-cli@1.28.2

src/query/catalog/src/plan/pushdown.rs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -224,21 +224,17 @@ impl PushDownInfo {
224224
if !TopK::support_type(data_type) {
225225
return None;
226226
}
227-
228227
let leaf_fields = schema.leaf_fields();
229-
let (leaf_id, f) = leaf_fields
228+
leaf_fields
230229
.iter()
231230
.enumerate()
232231
.find(|&(_, p)| p.name() == id)
233-
.unwrap();
234-
235-
let top_k = TopK {
236-
limit: self.limit.unwrap(),
237-
field: f.clone(),
238-
asc: order.1,
239-
leaf_id,
240-
};
241-
Some(top_k)
232+
.map(|(leaf_id, f)| TopK {
233+
limit: self.limit.unwrap(),
234+
field: f.clone(),
235+
asc: order.1,
236+
leaf_id,
237+
})
242238
} else {
243239
None
244240
}

src/query/sql/src/executor/physical_plans/physical_table_scan.rs

Lines changed: 39 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -478,51 +478,47 @@ impl PhysicalPlanBuilder {
478478
})
479479
.transpose()?;
480480

481-
let order_by = scan
482-
.order_by
483-
.clone()
484-
.map(|items| {
485-
items
486-
.into_iter()
487-
.map(|item| {
488-
let metadata = self.metadata.read();
489-
let column = metadata.column(item.index);
490-
let (name, data_type) = match column {
491-
ColumnEntry::BaseTableColumn(BaseTableColumn {
492-
column_name,
493-
data_type,
494-
..
495-
}) => (column_name.clone(), DataType::from(data_type)),
496-
ColumnEntry::DerivedColumn(DerivedColumn {
497-
alias, data_type, ..
498-
}) => (alias.clone(), data_type.clone()),
499-
ColumnEntry::InternalColumn(TableInternalColumn {
500-
internal_column,
501-
..
502-
}) => (
503-
internal_column.column_name().to_owned(),
504-
internal_column.data_type(),
505-
),
506-
ColumnEntry::VirtualColumn(VirtualColumn {
507-
column_name,
508-
data_type,
509-
..
510-
}) => (column_name.clone(), DataType::from(data_type)),
511-
};
512-
513-
// sort item is already a column
514-
let scalar = RemoteExpr::ColumnRef {
515-
span: None,
516-
id: name.clone(),
481+
let order_by = scan.order_by.clone().map(|items| {
482+
items
483+
.into_iter()
484+
.filter_map(|item| {
485+
let metadata = self.metadata.read();
486+
let column = metadata.column(item.index);
487+
let (name, data_type) = match column {
488+
ColumnEntry::BaseTableColumn(BaseTableColumn {
489+
column_name,
490+
data_type,
491+
..
492+
}) => (column_name.clone(), DataType::from(data_type)),
493+
ColumnEntry::InternalColumn(TableInternalColumn {
494+
internal_column,
495+
..
496+
}) => (
497+
internal_column.column_name().to_owned(),
498+
internal_column.data_type(),
499+
),
500+
ColumnEntry::VirtualColumn(VirtualColumn {
501+
column_name,
517502
data_type,
518-
display_name: name,
519-
};
503+
..
504+
}) => (column_name.clone(), DataType::from(data_type)),
505+
ColumnEntry::DerivedColumn(_) => {
506+
return None;
507+
}
508+
};
520509

521-
Ok((scalar, item.asc, item.nulls_first))
522-
})
523-
.collect::<Result<Vec<_>>>()
524-
})
525-
.transpose()?;
510+
// sort item is already a column
511+
let scalar = RemoteExpr::ColumnRef {
512+
span: None,
513+
id: name.clone(),
514+
data_type,
515+
display_name: name,
516+
};
517+
518+
Some((scalar, item.asc, item.nulls_first))
519+
})
520+
.collect::<Vec<_>>()
521+
});
526522

527523
let virtual_column = self.build_virtual_column(&scan.columns);
528524

tests/sqllogictests/suites/base/09_fuse_engine/09_0039_topk_sorter.test

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,18 @@ select * from test where url like '%google%' order by event_time limit 10;
3939
0 2024-01-03 00:00:00.000000 http://www.google.com/xxx/
4040
0 2024-01-04 00:00:00.000000 http://www.google.com/xxx/
4141

42+
43+
statement ok
44+
create table test_k storage_format = 'native' as select * from test;
45+
46+
47+
query ITT
48+
select * from test_k where url like '%google%' order by event_time limit 1;
49+
----
50+
0 2024-01-01 00:00:00.000000 http://www.google.com/xxx/
51+
4252
statement ok
4353
drop table test
54+
55+
statement ok
56+
drop table test_k

0 commit comments

Comments
 (0)