diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2016-07-04 16:37:26 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2016-07-04 16:54:01 -0400 |
| commit | 428dfeee48c1fc4ceb5712b8934e90132ee57e33 (patch) | |
| tree | 3302a446ef026ffa995a471ec2fb8e88a1533198 | |
| parent | f5ec60c8811feb92ded85f8a4f8c3071e44acddf (diff) | |
| download | sqlalchemy-428dfeee48c1fc4ceb5712b8934e90132ee57e33.tar.gz | |
Repair PG BIGSERIAL w/ TypeDecorator, Variant
Some of the dialect impl memoization for TypeDecorator
necessarily keeps the top-level TypeDecorator type
around, since a user-defined type will have bind and result
set processing behavior. For both TypeDecorator and Variant,
PG dialect needs to ensure it's looking at the SQLAlchemy
type to check for SmallInteger / BigInteger.
Fixes: 3739
Change-Id: I2d45fb997f17c6272d6bb826a77d2dba665adae7
(cherry picked from commit 421fa6b8bf9f0c3c5041579c89ec405ce0f5e0b0)
| -rw-r--r-- | doc/build/changelog/changelog_10.rst | 10 | ||||
| -rw-r--r-- | lib/sqlalchemy/dialects/postgresql/base.py | 3 | ||||
| -rw-r--r-- | test/dialect/postgresql/test_dialect.py | 21 |
3 files changed, 33 insertions, 1 deletions
diff --git a/doc/build/changelog/changelog_10.rst b/doc/build/changelog/changelog_10.rst index a1e7d3678..7240e8e68 100644 --- a/doc/build/changelog/changelog_10.rst +++ b/doc/build/changelog/changelog_10.rst @@ -19,6 +19,16 @@ :version: 1.0.14 .. change:: + :tags: bug, postgresql + :tickets: 3739 + :versions: 1.1.0b3 + + Fixed bug whereby :class:`.TypeDecorator` and :class:`.Variant` + types were not deeply inspected enough by the Postgresql dialect + to determine if SMALLSERIAL or BIGSERIAL needed to be rendered + rather than SERIAL. + + .. change:: :tags: bug, sql :tickets: 3735 :versions: 1.1.0b2 diff --git a/lib/sqlalchemy/dialects/postgresql/base.py b/lib/sqlalchemy/dialects/postgresql/base.py index 688ce9e1c..cc0f890dc 100644 --- a/lib/sqlalchemy/dialects/postgresql/base.py +++ b/lib/sqlalchemy/dialects/postgresql/base.py @@ -1484,6 +1484,9 @@ class PGDDLCompiler(compiler.DDLCompiler): colspec = self.preparer.format_column(column) impl_type = column.type.dialect_impl(self.dialect) + if isinstance(impl_type, sqltypes.TypeDecorator): + impl_type = impl_type.impl + if column.primary_key and \ column is column.table._autoincrement_column and \ ( diff --git a/test/dialect/postgresql/test_dialect.py b/test/dialect/postgresql/test_dialect.py index c0e1819d6..9f7af8638 100644 --- a/test/dialect/postgresql/test_dialect.py +++ b/test/dialect/postgresql/test_dialect.py @@ -8,7 +8,7 @@ from sqlalchemy import testing import datetime from sqlalchemy import ( Table, Column, select, MetaData, text, Integer, String, Sequence, Numeric, - DateTime, BigInteger, func, extract, SmallInteger) + DateTime, BigInteger, func, extract, SmallInteger, TypeDecorator) from sqlalchemy import exc, schema from sqlalchemy.dialects.postgresql import base as postgresql import logging @@ -252,6 +252,15 @@ class MiscTest(fixtures.TestBase, AssertsExecutionResults, AssertsCompiledSQL): "postgresql >= 8.2", "requires standard_conforming_strings") def test_serial_integer(self): + class BITD(TypeDecorator): + impl = Integer + + def load_dialect_impl(self, dialect): + if dialect.name == 'postgresql': + return BigInteger() + else: + return Integer() + for version, type_, expected in [ (None, Integer, 'SERIAL'), (None, BigInteger, 'BIGSERIAL'), @@ -259,6 +268,16 @@ class MiscTest(fixtures.TestBase, AssertsExecutionResults, AssertsCompiledSQL): ((9, 2), SmallInteger, 'SMALLSERIAL'), (None, postgresql.INTEGER, 'SERIAL'), (None, postgresql.BIGINT, 'BIGSERIAL'), + ( + None, Integer().with_variant(BigInteger(), 'postgresql'), + 'BIGSERIAL'), + ( + None, Integer().with_variant(postgresql.BIGINT, 'postgresql'), + 'BIGSERIAL'), + ( + (9, 2), Integer().with_variant(SmallInteger, 'postgresql'), + 'SMALLSERIAL'), + (None, BITD(), 'BIGSERIAL') ]: m = MetaData() |
