(self)
| 165 | ) |
| 166 | |
| 167 | def test_recursive_w_anon_labels(self): |
| 168 | parts = table( |
| 169 | "parts", column("part"), column("sub_part"), column("quantity") |
| 170 | ) |
| 171 | |
| 172 | included_parts = ( |
| 173 | select( |
| 174 | parts.c.sub_part.label(None), |
| 175 | parts.c.part.label(None), |
| 176 | parts.c.quantity, |
| 177 | ) |
| 178 | .where(parts.c.part == "our part") |
| 179 | .cte(recursive=True) |
| 180 | ) |
| 181 | |
| 182 | incl_alias = included_parts.alias() |
| 183 | parts_alias = parts.alias() |
| 184 | included_parts = included_parts.union( |
| 185 | select( |
| 186 | parts_alias.c.sub_part, |
| 187 | parts_alias.c.part, |
| 188 | parts_alias.c.quantity, |
| 189 | ).where(parts_alias.c.part == incl_alias.c[0]) |
| 190 | ) |
| 191 | |
| 192 | s = ( |
| 193 | select( |
| 194 | included_parts.c[0], |
| 195 | func.sum(included_parts.c.quantity).label("total_quantity"), |
| 196 | ) |
| 197 | .select_from( |
| 198 | included_parts.join(parts, included_parts.c[1] == parts.c.part) |
| 199 | ) |
| 200 | .group_by(included_parts.c[0]) |
| 201 | ) |
| 202 | self.assert_compile( |
| 203 | s, |
| 204 | "WITH RECURSIVE anon_1(sub_part_1, part_1, quantity) " |
| 205 | "AS (SELECT parts.sub_part AS sub_part_1, parts.part " |
| 206 | "AS part_1, parts.quantity AS quantity FROM parts " |
| 207 | "WHERE parts.part = :part_2 UNION " |
| 208 | "SELECT parts_1.sub_part AS sub_part, " |
| 209 | "parts_1.part AS part, parts_1.quantity " |
| 210 | "AS quantity FROM parts AS parts_1, anon_1 AS anon_2 " |
| 211 | "WHERE parts_1.part = anon_2.sub_part_1) " |
| 212 | "SELECT anon_1.sub_part_1, " |
| 213 | "sum(anon_1.quantity) AS total_quantity FROM anon_1 " |
| 214 | "JOIN parts ON anon_1.part_1 = parts.part " |
| 215 | "GROUP BY anon_1.sub_part_1", |
| 216 | ) |
| 217 | |
| 218 | def test_recursive_inner_cte_unioned_to_alias(self): |
| 219 | parts = table( |
nothing calls this directly
no test coverage detected