diff --git a/crates/logical-asap-optimization/src/pass2/memo/rules/finer_aggregate.rs b/crates/logical-asap-optimization/src/pass2/memo/rules/finer_aggregate.rs index 64da2407d..2712061ee 100644 --- a/crates/logical-asap-optimization/src/pass2/memo/rules/finer_aggregate.rs +++ b/crates/logical-asap-optimization/src/pass2/memo/rules/finer_aggregate.rs @@ -1,12 +1,12 @@ //! Read a SQL aggregate from a finer aggregate's result //! ([`match_finer`](crate::pass2::finer_aggregate::match_finer)): filter the finer //! rows, then merge them into the query's groups with each measure's rollup. -use super::reuse::append_reader; +use super::reuse::add_candidate_over_groups; use crate::pass2::finer_aggregate::match_finer; use crate::pass2::memo::state_groups::Pass2RuleError; use asap_types::ir::operator::{AggIntent, Reduction}; use asap_types::ir::{NonASAPOp, Operator, OperatorNode, OperatorResultKind}; -use asap_types::stages::{Memo, OriginOfCandidateForMemoGroup}; +use asap_types::stages::{Memo, MemoGroupId, OriginOfCandidateForMemoGroup}; use std::collections::HashMap; use std::rc::Rc; @@ -167,9 +167,9 @@ fn add_read(memo: &mut Memo, owner: usize, finer: usize) -> Result= groups_before { + // Added: the exact candidates replace the group's own candidate. + memo.candidates[id.0 as usize] = candidates; + } else { + // Found (another group's exact input equals it): keep its + // candidates and add the new ones. + for candidate in candidates { + memo.add_candidate(id, candidate); + } + } known.insert(group, Some(id)); Ok(Some(id)) }