From 428dfeee48c1fc4ceb5712b8934e90132ee57e33 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Mon, 4 Jul 2016 16:37:26 -0400 Subject: 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) --- test/dialect/postgresql/test_dialect.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'test') 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() -- cgit v1.2.1