# -*- encoding: utf-8
+
from sqlalchemy import Column
from sqlalchemy import engine_from_config
from sqlalchemy import event
from sqlalchemy.dialects.mssql import pymssql
from sqlalchemy.dialects.mssql import pyodbc
from sqlalchemy.engine import url
+from sqlalchemy.exc import IntegrityError
+from sqlalchemy.testing import assert_raises
from sqlalchemy.testing import assert_raises_message
from sqlalchemy.testing import assert_warnings
from sqlalchemy.testing import engines
)
for error in [
- MockDBAPIError("[%s] some pyodbc message" % code)
+ MockDBAPIError(code, "[%s] some pyodbc message" % code)
for code in [
"08S01",
"01002",
eq_(
dialect.is_disconnect(
- MockProgrammingError("not an error"), None, None
+ MockProgrammingError("Query with abc08007def failed"),
+ None,
+ None,
),
False,
)
dialect.get_isolation_level,
connection,
)
+
+
+class InvalidTransactionFalsePositiveTest(fixtures.TablesTest):
+ __only_on__ = "mssql"
+ __backend__ = True
+
+ @classmethod
+ def define_tables(cls, metadata):
+ Table(
+ "error_t",
+ metadata,
+ Column("error_code", String(50), primary_key=True),
+ )
+
+ @classmethod
+ def insert_data(cls, connection):
+ connection.execute(
+ cls.tables.error_t.insert(), [{"error_code": "01002"}],
+ )
+
+ def test_invalid_transaction_detection(self, connection):
+ # issue #5359
+ t = self.tables.error_t
+
+ # force duplicate PK error
+ assert_raises(
+ IntegrityError,
+ connection.execute,
+ t.insert(),
+ {"error_code": "01002"},
+ )
+
+ # this should not fail with
+ # "Can't reconnect until invalid transaction is rolled back."
+ result = connection.execute(t.select()).fetchall()
+ eq_(len(result), 1)