evals / django-aggregate-default

baseline

Expected

Hidden from the reviewer, like the grading note below.

summary-flags
holds

The Coalesce wrapper copies is_summary from the resolved aggregate. The contract holds.

Change

No patch. The reviewer checks the whole project.

Contracts

summary-flags
---
name: summary-flags
message: A wrapper around a resolved aggregate inherits its summary flag.
---

## Rules

When `Aggregate.resolve_expression` wraps the resolved aggregate in `Coalesce` for a `default`, the wrapper's
`is_summary` equals the wrapped aggregate's `is_summary`.
Do not set it to a constant. `annotate()` resolves aggregates through the same path with `summarize=False`, and a
wrapper marked as a summary there can break subquery pushdown.
The wrapper must carry the flag; returning a `Coalesce` without it breaks `aggregate()` with `default`.

`Func.resolve_expression`, which `Aggregate.resolve_expression` calls first, sets the resolved aggregate's
`is_summary` to the `summarize` argument.

## Checks

From the Django root, run `./runtests.py aggregation aggregation_regress annotations`.