summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2016-07-12 16:53:37 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2016-07-13 11:49:34 -0400
commit889c011a0f7bce82cea1c9c2ac0c46cec4353d4d (patch)
treee64002939638ab49fd52d7a52ba1197f5a9558dd
parentd80b709ea0a683b10ae46bb552204be59b5c73f8 (diff)
downloadsqlalchemy-889c011a0f7bce82cea1c9c2ac0c46cec4353d4d.tar.gz
Ensure DML provides named_with_column for CTE(Alias)
Fixed bug in new CTE feature for update/insert/delete whereby an anoymous (e.g. no name passed) :class:`.CTE` construct around the statement would fail. The Alias base class of CTE checks for the "named_with_column" attribute in order to detect if the underlying selectable has a name; UpdateBase now provides this as False. Change-Id: I4b0309db21379a4c0cb93085298c86da3cf840e4 Fixes: #3744
-rw-r--r--doc/build/changelog/changelog_11.rst8
-rw-r--r--lib/sqlalchemy/sql/dml.py1
-rw-r--r--test/sql/test_cte.py32
3 files changed, 41 insertions, 0 deletions
diff --git a/doc/build/changelog/changelog_11.rst b/doc/build/changelog/changelog_11.rst
index 75c434da8..284c8e97c 100644
--- a/doc/build/changelog/changelog_11.rst
+++ b/doc/build/changelog/changelog_11.rst
@@ -31,6 +31,14 @@
statement.
.. change::
+ :tags: bug, sql
+ :tickets: 3744
+
+ Fixed bug in new CTE feature for update/insert/delete whereby
+ an anoymous (e.g. no name passed) :class:`.CTE` construct around
+ the statement would fail.
+
+ .. change::
:tags: bug, ext
sqlalchemy.ext.indexable will intercept IndexError as well
diff --git a/lib/sqlalchemy/sql/dml.py b/lib/sqlalchemy/sql/dml.py
index b54b4792d..31e4d3d9c 100644
--- a/lib/sqlalchemy/sql/dml.py
+++ b/lib/sqlalchemy/sql/dml.py
@@ -32,6 +32,7 @@ class UpdateBase(
_hints = util.immutabledict()
_parameter_ordering = None
_prefixes = ()
+ named_with_column = False
def _process_colparams(self, parameters):
def process_single(p):
diff --git a/test/sql/test_cte.py b/test/sql/test_cte.py
index aa674403e..35d455257 100644
--- a/test/sql/test_cte.py
+++ b/test/sql/test_cte.py
@@ -530,6 +530,38 @@ class CTETest(fixtures.TestBase, AssertsCompiledSQL):
"upsert.quantity FROM upsert))"
)
+ def test_anon_update_cte(self):
+ orders = table(
+ 'orders',
+ column('region')
+ )
+ stmt = orders.update().where(orders.c.region == 'x').\
+ values(region='y').\
+ returning(orders.c.region).cte()
+
+ self.assert_compile(
+ stmt.select(),
+ "WITH anon_1 AS (UPDATE orders SET region=:region "
+ "WHERE orders.region = :region_1 RETURNING orders.region) "
+ "SELECT anon_1.region FROM anon_1"
+ )
+
+ def test_anon_insert_cte(self):
+ orders = table(
+ 'orders',
+ column('region')
+ )
+ stmt = orders.insert().\
+ values(region='y').\
+ returning(orders.c.region).cte()
+
+ self.assert_compile(
+ stmt.select(),
+ "WITH anon_1 AS (INSERT INTO orders (region) "
+ "VALUES (:region) RETURNING orders.region) "
+ "SELECT anon_1.region FROM anon_1"
+ )
+
def test_pg_example_one(self):
products = table('products', column('id'), column('date'))
products_log = table('products_log', column('id'), column('date'))