.. changelog::
:version: 0.9.9
+ .. change::
+ :tags: bug, sql
+ :versions: 1.0.0
+ :tickets: 3278
+
+ Fixed bug where using a :class:`.TypeDecorator` that implemented
+ a type that was also a :class:`.TypeDecorator` would fail with
+ Python's "Cannot create a consistent method resolution order (MRO)"
+ error, when any kind of SQL comparison expression were used against
+ an object using this type.
+
.. change::
:tags: bug, mysql
:versions: 1.0.0
@property
def comparator_factory(self):
- return type("TDComparator",
- (TypeDecorator.Comparator, self.impl.comparator_factory),
- {})
+ if TypeDecorator.Comparator in self.impl.comparator_factory.__mro__:
+ return self.impl.comparator_factory
+ else:
+ return type("TDComparator",
+ (TypeDecorator.Comparator,
+ self.impl.comparator_factory),
+ {})
def _gen_dialect_impl(self, dialect):
"""
return MyInteger
+class TypeDecoratorTypeDecoratorComparatorTest(
+ _CustomComparatorTests, fixtures.TestBase):
+
+ def _add_override_factory(self):
+
+ class MyIntegerOne(TypeDecorator):
+ impl = Integer
+
+ class comparator_factory(TypeDecorator.Comparator):
+
+ def __init__(self, expr):
+ self.expr = expr
+
+ def __add__(self, other):
+ return self.expr.op("goofy")(other)
+
+ def __and__(self, other):
+ return self.expr.op("goofy_and")(other)
+
+ class MyIntegerTwo(TypeDecorator):
+ impl = MyIntegerOne
+
+ return MyIntegerTwo
+
+
class TypeDecoratorWVariantComparatorTest(
_CustomComparatorTests,
fixtures.TestBase):