From 6e570ed90f745de71828f705ccc1785d67518116 Mon Sep 17 00:00:00 2001 From: pierrejeambrun Date: Thu, 26 Mar 2026 11:27:12 +0100 Subject: [PATCH] Fix dag_display_name property bypass for DagStats query --- .../src/airflow/api_fastapi/common/db/dag_runs.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/airflow-core/src/airflow/api_fastapi/common/db/dag_runs.py b/airflow-core/src/airflow/api_fastapi/common/db/dag_runs.py index 72565c45ef2a0..f9ae3d6c3b6c6 100644 --- a/airflow-core/src/airflow/api_fastapi/common/db/dag_runs.py +++ b/airflow-core/src/airflow/api_fastapi/common/db/dag_runs.py @@ -35,15 +35,18 @@ if TYPE_CHECKING: from sqlalchemy.orm import Session +# Use the hybrid_property for dag_display_name so the CASE WHEN fallback to dag_id +# is applied when dag_display_name is NULL. Using __table__.c would return raw NULLs +# and crash DagStatsResponse validation (https://github.com/apache/airflow/issues/64247). dagruns_select_with_state_count = ( - select( + select( # type: ignore[call-overload] DagRun.__table__.c.dag_id, DagRun.__table__.c.state, - DagModel.__table__.c.dag_display_name, + DagModel.dag_display_name, func.count(DagRun.__table__.c.state).label("count"), ) .join(DagModel, DagRun.__table__.c.dag_id == DagModel.__table__.c.dag_id) - .group_by(DagRun.__table__.c.dag_id, DagRun.__table__.c.state, DagModel.__table__.c.dag_display_name) + .group_by(DagRun.__table__.c.dag_id, DagRun.__table__.c.state, DagModel.dag_display_name) .order_by(DagRun.__table__.c.dag_id) )