]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Call nextval() on sequence when doing INSERT from SELECT
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 21 Dec 2016 18:39:56 +0000 (13:39 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 21 Dec 2016 18:39:56 +0000 (13:39 -0500)
Fixed bug where an INSERT from SELECT where the source table contains
an autoincrementing Sequence would fail to compile correctly.

Change-Id: I41eb9f65789a4007712ae61ed5fa23a9839a5128
Fixes: #3877
doc/build/changelog/changelog_11.rst
lib/sqlalchemy/sql/crud.py
test/sql/test_insert.py

index 2314a621d252abad4ba26db2649b0f2c2cc382fd..6b842ab077a11fd7793020bfe20da3ed8188dc68 100644 (file)
 .. changelog::
     :version: 1.1.5
 
+    .. change:: 3877
+        :tags: bug, oracle, postgresql
+        :tickets: 3877
+
+        Fixed bug where an INSERT from SELECT where the source table contains
+        an autoincrementing Sequence would fail to compile correctly.
+
     .. change:: 3875
         :tags: bug, oracle
         :tickets: 3875
index 9d10fbefc025563cfa5eaedb4acb64daf645c899..9808b7d90f67419ae4620dcce1590812ce330cbf 100644 (file)
@@ -505,7 +505,7 @@ def _append_param_insert_select_hasdefault(
             (not c.default.optional or
              not compiler.dialect.sequences_optional):
             proc = c.default
-            values.append((c, proc))
+            values.append((c, proc.next_value()))
     elif c.default.is_clause_element:
         proc = c.default.arg.self_group()
         values.append((c, proc))
index 2fa1860de6e9972eea94cdca94e80eeffeee12a2..73731e9527e46f70821d33b8059c4ae659d99d5f 100644 (file)
@@ -1,7 +1,8 @@
 #! coding:utf-8
 
 from sqlalchemy import Column, Integer, MetaData, String, Table,\
-    bindparam, exc, func, insert, select, column, text, table
+    bindparam, exc, func, insert, select, column, text, table,\
+    Sequence
 from sqlalchemy.dialects import mysql, postgresql
 from sqlalchemy.engine import default
 from sqlalchemy.testing import AssertsCompiledSQL,\
@@ -238,6 +239,24 @@ class InsertTest(_InsertTestBase, fixtures.TablesTest, AssertsCompiledSQL):
             checkparams={"name_1": "foo"}
         )
 
+    def test_insert_from_select_seq(self):
+        m = MetaData()
+
+        t1 = Table(
+            't', m,
+            Column('id', Integer, Sequence('id_seq'), primary_key=True),
+            Column('data', String)
+        )
+
+        stmt = t1.insert().from_select(('data', ), select([t1.c.data]))
+
+        self.assert_compile(
+            stmt,
+            "INSERT INTO t (data, id) SELECT t.data, "
+            "nextval('id_seq') AS next_value_1 FROM t",
+            dialect=postgresql.dialect()
+        )
+
     def test_insert_from_select_cte_one(self):
         table1 = self.tables.mytable