SQL server shouldn't try to fetch lastrowid for inline=True

Issue #3876 resolved
Mike Bayer repo owner created an issue
diff --git a/lib/sqlalchemy/testing/suite/test_insert.py b/lib/sqlalchemy/testing/suite/test_insert.py
index 70e8a6b..c0b6b18 100644
--- a/lib/sqlalchemy/testing/suite/test_insert.py
+++ b/lib/sqlalchemy/testing/suite/test_insert.py
@@ -141,6 +141,56 @@ class InsertBehaviorTest(fixtures.TablesTest):
         assert len(r.fetchall())

     @requirements.insert_from_select
+    def test_insert_from_select_autoinc(self):
+        src_table = self.tables.manual_pk
+        dest_table = self.tables.autoinc_pk
+        config.db.execute(
+            src_table.insert(),
+            [
+                dict(id=1, data="data1"),
+                dict(id=2, data="data2"),
+                dict(id=3, data="data3"),
+            ]
+        )
+
+        result = config.db.execute(
+            dest_table.insert().
+            from_select(
+                ("data",),
+                select([src_table.c.data]).
+                where(src_table.c.data.in_(["data2", "data3"]))
+            )
+        )
+
+        eq_(result.inserted_primary_key, [None])
+
+        result = config.db.execute(
+            select([dest_table.c.data]).order_by(dest_table.c.data)
+        )
+        eq_(result.fetchall(), [("data2", ), ("data3", )])
+
+    @requirements.insert_from_select
+    def test_insert_from_select_autoinc_no_rows(self):
+        src_table = self.tables.manual_pk
+        dest_table = self.tables.autoinc_pk
+
+        result = config.db.execute(
+            dest_table.insert().
+            from_select(
+                ("data",),
+                select([src_table.c.data]).
+                where(src_table.c.data.in_(["data2", "data3"]))
+            )
+        )
+        eq_(result.inserted_primary_key, [None])
+
+        result = config.db.execute(
+            select([dest_table.c.data]).order_by(dest_table.c.data)
+        )
+
+        eq_(result.fetchall(), [])
+
+    @requirements.insert_from_select
     def test_insert_from_select(self):
         table = self.tables.manual_pk
         config.db.execute(

#!

InsertBehaviorTest_mssql_pyodbc.test_insert_from_select_autoinc_no_rows ______________________________________________
Traceback (most recent call last):
  File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/testing/suite/test_insert.py", line 182, in test_insert_from_select_autoinc_no_rows
    where(src_table.c.data.in_(["data2", "data3"]))
  File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/engine/base.py", line 2055, in execute
    return connection.execute(statement, *multiparams, **params)
  File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/engine/base.py", line 945, in execute
    return meth(self, multiparams, params)
  File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/sql/elements.py", line 263, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/engine/base.py", line 1053, in _execute_clauseelement
    compiled_sql, distilled_params
  File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/engine/base.py", line 1199, in _execute_context
    context.post_exec()
  File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/dialects/mssql/pyodbc.py", line 244, in post_exec
    self._lastrowid = int(row[0])
TypeError: int() argument must be a string or a number, not 'NoneType'

Comments (2)

  1. Mike Bayer reporter

    Don't select lastrowid for inline=True

    • Fixed bug where SQL Server dialects would attempt to select the last row identity for an INSERT from SELECT, failing in the case when the SELECT has no rows. For such a statement, the inline flag is set to True indicating no last primary key should be fetched.

    Change-Id: Ic40d56d9eadadc3024a4d71245f9eed4c420024a Fixes: #3876

    → <<cset f472405e598a>>

  2. Log in to comment