From 502152de2a77d213489d9652f1779dffde1e6d7b Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sun, 30 Sep 2012 18:23:21 -0400 Subject: [PATCH] mssql: - [bug] Fixed bug where reflection of primary key constraint would double up columns if the same constraint/table existed in multiple schemas. - force returns_rows to False for inserts where we know rows shouldnt be returned; allows post_exec() to use the cursor without issue --- CHANGES | 4 ++++ lib/sqlalchemy/dialects/mssql/base.py | 1 + lib/sqlalchemy/engine/base.py | 2 ++ lib/sqlalchemy/engine/result.py | 5 ++--- lib/sqlalchemy/testing/suite/test_ddl.py | 2 +- lib/sqlalchemy/testing/suite/test_insert.py | 2 +- 6 files changed, 11 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index 080e9d205c..d304488e2e 100644 --- a/CHANGES +++ b/CHANGES @@ -967,6 +967,10 @@ are also present in 0.8. attribute, causing the construct to not compile correctly a second time. [ticket:2545] + - [bug] Fixed bug where reflection of primary key constraint + would double up columns if the same constraint/table + existed in multiple schemas. + 0.7.8 ===== - orm diff --git a/lib/sqlalchemy/dialects/mssql/base.py b/lib/sqlalchemy/dialects/mssql/base.py index 7552375875..6dd25350fa 100644 --- a/lib/sqlalchemy/dialects/mssql/base.py +++ b/lib/sqlalchemy/dialects/mssql/base.py @@ -1419,6 +1419,7 @@ class MSDialect(default.DefaultDialect): # Primary key constraints s = sql.select([C.c.column_name, TC.c.constraint_type], sql.and_(TC.c.constraint_name == C.c.constraint_name, + TC.c.table_schema == C.c.table_schema, C.c.table_name == tablename, C.c.table_schema == owner) ) diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index e8b22fdc64..05ca0f980d 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -882,8 +882,10 @@ class Connection(Connectable): if context._is_implicit_returning: context._fetch_implicit_returning(result) result.close(_autoclose_connection=False) + result._metadata = None elif not context._is_explicit_returning: result.close(_autoclose_connection=False) + result._metadata = None elif result._metadata is None: # no results, get rowcount # (which requires open cursor on some drivers diff --git a/lib/sqlalchemy/engine/result.py b/lib/sqlalchemy/engine/result.py index a9bb248b3e..bf6410f155 100644 --- a/lib/sqlalchemy/engine/result.py +++ b/lib/sqlalchemy/engine/result.py @@ -369,6 +369,7 @@ class ResultProxy(object): _process_row = RowProxy out_parameters = None _can_close_connection = False + _metadata = None def __init__(self, context): self.context = context @@ -382,9 +383,7 @@ class ResultProxy(object): def _init_metadata(self): metadata = self._cursor_description() - if metadata is None: - self._metadata = None - else: + if metadata is not None: self._metadata = ResultMetaData(self, metadata) def keys(self): diff --git a/lib/sqlalchemy/testing/suite/test_ddl.py b/lib/sqlalchemy/testing/suite/test_ddl.py index 2bd2518bf2..466429aa5e 100644 --- a/lib/sqlalchemy/testing/suite/test_ddl.py +++ b/lib/sqlalchemy/testing/suite/test_ddl.py @@ -11,7 +11,7 @@ class TableDDLTest(fixtures.TestBase): def _simple_fixture(self): return Table('test_table', self.metadata, - Column('id', Integer, primary_key=True), + Column('id', Integer, primary_key=True, autoincrement=False), Column('data', String(50)) ) diff --git a/lib/sqlalchemy/testing/suite/test_insert.py b/lib/sqlalchemy/testing/suite/test_insert.py index 53a70e0c6a..0a9896ffb4 100644 --- a/lib/sqlalchemy/testing/suite/test_insert.py +++ b/lib/sqlalchemy/testing/suite/test_insert.py @@ -103,7 +103,7 @@ class InsertBehaviorTest(fixtures.TablesTest): ) assert r.closed assert r.is_insert - assert r.returns_rows + assert not r.returns_rows __all__ = ('InsertSequencingTest', 'InsertBehaviorTest') -- 2.47.3