Affects Version/s: None
Fix Version/s: 1.11.0
I still have a problem with Aggregates that lack a group set, like SELECT COUNT(*) FROM s.foo WHERE 1 = 0. PruneEmptyRules doesn't reduce that, since the result is going to be one row, not empty. The ValuesReduceRules don't either, because they don't touch Aggregates.
I ended up addressing this with a rule on my end: https://gist.github.com/gianm/1c192a47a7ce284be8af986f97e6dd8f
Does that approach make sense? If so do you think it makes sense to contribute to Calcite?
One thing I'm not sure about is if there's a better way to figure out what should be 0 and what should be NULL other than hard-coding COUNT and SUM0.
Let's call it AggregateValuesRule, consistent with the naming convention where we start with the type of rel(s) being acted on. Initially it would apply to an empty Values, but potentially it could apply to one or more values.
I don't recall aggregates having a way to tell us what they will return on empty (or constant) input. In future we could use the constant reducer for that, but for now, the rule should match a particular set of aggregates: COUNT and SUM0 return zero; MIN, MAX, SUM return null. It must abort if it sees an aggregate it does not know how to handle.