]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commit
Add Non linear CTE support
authorEric Masseran <eric.masseran@gmail.com>
Tue, 2 Nov 2021 20:40:04 +0000 (16:40 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 16 Nov 2021 19:45:35 +0000 (14:45 -0500)
commit24a53fd8fce2cdfb0154caa687ef893bcff120a7
tree586906557ee4e78b27c56cf17c1697fc73a75cf3
parent80b38b45c75f347af70d1be95c27704bcfc6b6bd
Add Non linear CTE support

"Compound select" methods like :meth:`_sql.Select.union`,
:meth:`_sql.Select.intersect_all` etc. now accept ``*other`` as an argument
rather than ``other`` to allow for multiple additional SELECTs to be
compounded with the parent statement at once. In particular, the change as
applied to :meth:`_sql.CTE.union` and :meth:`_sql.CTE.union_all` now allow
for a so-called "non-linear CTE" to be created with the :class:`_sql.CTE`
construct, whereas previously there was no way to have more than two CTE
sub-elements in a UNION together while still correctly calling upon the CTE
in recursive fashion. Pull request courtesy Eric Masseran.

Allow:

```sql
WITH RECURSIVE nodes(x) AS (
   SELECT 59
   UNION
   SELECT aa FROM edge JOIN nodes ON bb=x
   UNION
   SELECT bb FROM edge JOIN nodes ON aa=x
)
SELECT x FROM nodes;
```

Based on @zzzeek suggestion: https://github.com/sqlalchemy/sqlalchemy/pull/7133#issuecomment-933882348

Fixes: #7259
Closes: #7260
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/7260
Pull-request-sha: 2565a5fd4b1940e92125e53aeaa731cc682f49bb

Change-Id: I685c8379762b5fb6ab4107ff8f4d8a4de70c0ca6
(cherry picked from commit 958f902b1fc528fed0be550bc573545de47ed854)
doc/build/changelog/unreleased_14/7259.rst [new file with mode: 0644]
lib/sqlalchemy/sql/selectable.py
test/sql/test_cte.py
test/sql/test_select.py