SQL server shouldn't try to fetch lastrowid for inline=True
Issue #3876
resolved
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)
-
reporter -
reporter - changed status to resolved
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>>
- Log in to comment
https://gerrit.sqlalchemy.org/#/c/265/