Skip to content

Commit

Permalink
Merge pull request #7013 from leiysky/fix-prune-columns
Browse files Browse the repository at this point in the history
fix(planner): Fix prune projection
  • Loading branch information
leiysky authored Aug 5, 2022
2 parents 050c56f + 2e8ad53 commit f6dda7b
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 2 deletions.
8 changes: 7 additions & 1 deletion query/src/sql/optimizer/heuristic/prune_columns.rs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,13 @@ impl ColumnPruner {
))
}
RelOperator::Project(p) => {
let used: ColumnSet = p.columns.intersection(&required).cloned().collect();
let mut used: ColumnSet = p.columns.intersection(&required).cloned().collect();
if used.is_empty() {
// Keep at least one column for project.
used.insert(*p.columns.iter().sorted().take(1).next().ok_or_else(|| {
ErrorCode::LogicalError("Invalid Project without output column")
})?);
}
Ok(SExpr::create_unary(
RelOperator::Project(Project {
columns: used.clone(),
Expand Down
5 changes: 5 additions & 0 deletions query/tests/it/sql/optimizer/heuristic/prune_columns.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@ pub async fn test_heuristic_optimizer_prune_columns() -> Result<()> {
query: "select name from system.functions order by example".to_string(),
rules: vec![],
},
Suite {
comment: "# Prune unused columns with cross join".to_string(),
query: "select t.number from numbers(10) t where exists(select * from numbers(10))".to_string(),
rules: vec![],
},
];

run_suites(ctx, &mut file, &suites, run_test).await
Expand Down
17 changes: 17 additions & 0 deletions query/tests/it/sql/optimizer/heuristic/testdata/prune_columns.test
Original file line number Diff line number Diff line change
Expand Up @@ -88,3 +88,20 @@ Project: [name (#0)]
Scan: default.system.functions


# Prune unused columns with cross join
select t.number from numbers(10) t where exists(select * from numbers(10))
----
Project: [number (#0)]
EvalScalar: [t.number (#0)]
Filter: [subquery_3 (#3)]
CrossJoin
Scan: default.system.numbers
Project: [subquery (#3)]
EvalScalar: [count(*) (#2) = 1]
Aggregate(Initial): group items: [], aggregate functions: [count(*)]
Limit: [1], Offset: [0]
Project: [number (#1)]
EvalScalar: [numbers.number (#1)]
Scan: default.system.numbers


Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ select t.number from numbers(1) as t where exists (select * from numbers(1) wher
Project: [number (#0)]
CrossJoin
Scan: default.system.numbers
Project: []
Project: [subquery (#3)]
Filter: [subquery_3 (#3)]
EvalScalar: [count(*) (#2) = 1]
Aggregate(Final): group items: [], aggregate functions: [count(*)]
Expand Down
10 changes: 10 additions & 0 deletions tests/logictest/suites/base/15_query/subquery.test
Original file line number Diff line number Diff line change
Expand Up @@ -615,6 +615,16 @@ ORDER BY c.c_id
5 0
6 0

statement query I
select * from numbers(5) where exists(select * from numbers(1)) order by number;

----
0
1
2
3
4


statement ok
drop table o;
Expand Down

1 comment on commit f6dda7b

@vercel
Copy link

@vercel vercel bot commented on f6dda7b Aug 5, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Successfully deployed to the following URLs:

databend – ./

databend-git-main-databend.vercel.app
databend-databend.vercel.app
databend.vercel.app
databend.rs

Please sign in to comment.