Skip to content

Commit 4abed57

Browse files
Col-Waltz0x501D
authored andcommitted
Fix: common_sub_expression_eliminate optimizer rule failed
Common_sub_expression_eliminate rule failed with error: `SchemaError(FieldNotFound {field: <name>}, valid_fields: []})` due to the schema being changed by the second application of `find_common_exprs`. Used NamePreserver mechanism to restore original schema name and generate Projection with original names at the end of aggregate optimization. Jira: TNTP-996
1 parent 9e17b4f commit 4abed57

2 files changed

Lines changed: 49 additions & 2 deletions

File tree

datafusion/optimizer/src/common_subexpr_eliminate.rs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,19 @@ impl CommonSubexprEliminate {
527527
} => {
528528
let rewritten_aggr_expr = new_exprs_list.pop().unwrap();
529529
let new_aggr_expr = original_exprs_list.pop().unwrap();
530+
let saved_names = if let Some(aggr_expr) = aggr_expr {
531+
let name_perserver = NamePreserver::new_for_projection();
532+
aggr_expr
533+
.iter()
534+
.map(|expr| Some(name_perserver.save(expr)))
535+
.collect::<Vec<_>>()
536+
} else {
537+
new_aggr_expr
538+
.clone()
539+
.into_iter()
540+
.map(|_| None)
541+
.collect::<Vec<_>>()
542+
};
530543

531544
let mut agg_exprs = common_exprs
532545
.into_iter()
@@ -542,10 +555,19 @@ impl CommonSubexprEliminate {
542555
&mut proj_exprs,
543556
)?
544557
}
545-
for (expr_rewritten, expr_orig) in
546-
rewritten_aggr_expr.into_iter().zip(new_aggr_expr)
558+
for ((expr_rewritten, expr_orig), saved_name) in
559+
rewritten_aggr_expr
560+
.into_iter()
561+
.zip(new_aggr_expr)
562+
.zip(saved_names)
547563
{
548564
if expr_rewritten == expr_orig {
565+
let expr_rewritten =
566+
if let Some(saved_name) = saved_name {
567+
saved_name.restore(expr_rewritten)
568+
} else {
569+
expr_rewritten
570+
};
549571
if let Expr::Alias(Alias { expr, name, .. }) =
550572
expr_rewritten
551573
{

datafusion/sqllogictest/test_files/aggregate.slt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,31 @@ SELECT c2, var_samp(c12) FILTER (WHERE c12 > 0.90) FROM aggregate_test_100 GROUP
575575
4 NULL
576576
5 0.000269544643
577577

578+
statement ok
579+
CREATE TABLE t(
580+
a DOUBLE,
581+
b BIGINT,
582+
c INT
583+
) AS VALUES
584+
(1.0, 10, -5),
585+
(2.0, 20, -5),
586+
(3.0, 20, 4)
587+
588+
# Common sub-expression elimination.
589+
query III
590+
WITH s AS (
591+
SELECT
592+
COUNT(a) FILTER (WHERE (b * b) - 3600 <= b),
593+
COUNT(a) FILTER (WHERE (b * b) - 3000 <= b AND (c >= 0)),
594+
COUNT(a) FILTER (WHERE (b * b) - 3000 <= b AND (c >= 0) AND (c >= 0))
595+
FROM t
596+
) SELECT * FROM s
597+
----
598+
3 1 1
599+
600+
statement ok
601+
DROP TABLE t
602+
578603
# Restore the default dialect
579604
statement ok
580605
set datafusion.sql_parser.dialect = 'Generic';

0 commit comments

Comments
 (0)