]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Support Delete
authorEric Masseran <eric.masseran@gmail.com>
Mon, 12 Jul 2021 09:54:11 +0000 (11:54 +0200)
committerEric Masseran <eric.masseran@gmail.com>
Mon, 12 Jul 2021 09:54:11 +0000 (11:54 +0200)
lib/sqlalchemy/sql/compiler.py
test/sql/test_cte.py

index 15faf350d5ff0a91ae7f5e97f4abbdc9d344206f..e0c102819004c6396287cf182c4d7911639ab22f 100644 (file)
@@ -3892,8 +3892,9 @@ class SQLCompiler(Compiled):
                 delete_stmt, delete_stmt._returning
             )
 
-        if self.ctes and toplevel:
-            text = self._render_cte_clause() + text
+        if self.ctes:
+            nesting_level = len(self.stack) if not toplevel else None
+            text = self._render_cte_clause(nesting_level=nesting_level) + text
 
         self.stack.pop(-1)
 
index 887738d5f53b477bb2fa8e8186b917ba85f40803..09404dafb202fb1ed97117854618d869126980d1 100644 (file)
@@ -1650,3 +1650,31 @@ class NestingCTETest(fixtures.TestBase, AssertsCompiledSQL):
             "RETURNING table_1.id, table_1.price) "
             "SELECT update_cte.id, update_cte.price FROM update_cte",
         )
+
+    def test_select_from_delete_cte_with_nesting(self):
+        t1 = table("table_1", column("id"), column("price"))
+
+        generator_cte = select([literal(1).label("id")]).cte(
+            "generator", nesting=True
+        )
+
+        dlt = (
+            t1.delete()
+            .where(t1.c.id == generator_cte.c.id)
+            .returning(t1.c.id, t1.c.price)
+        )
+
+        cte = dlt.cte("delete_cte")
+
+        qry = select(cte)
+
+        self.assert_compile(
+            qry,
+            "WITH delete_cte AS "
+            "(WITH generator AS "
+            "(SELECT %(param_1)s AS id) "
+            "DELETE FROM table_1 USING generator "
+            "WHERE table_1.id = generator.id RETURNING table_1.id, "
+            "table_1.price) SELECT delete_cte.id, delete_cte.price "
+            "FROM delete_cte",
+        )