]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Ensure post-__clause_element__() expression are used in Index
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 31 Jul 2016 04:10:04 +0000 (00:10 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 31 Jul 2016 04:10:04 +0000 (00:10 -0400)
The change in Index for 1.1 combined with the fix for
ref #3763 still fails to deliver the correct object
resolved by __clause_element__() to the list of expressions
for compilation.   Make sure we use the expression that's
been unwrapped from __clause_element__().

Change-Id: Ie1df8db5090de665048331786f0024d52851923f
Fixes: #3763
lib/sqlalchemy/sql/schema.py
test/sql/test_metadata.py

index 2c5daa17cdd890b0c58e03e78736a116d7c7d262..457259d617cd76cddfba6e49989c919e836dc429 100644 (file)
@@ -3287,12 +3287,14 @@ class Index(DialectKWArgs, ColumnCollectionMixin, SchemaItem):
         self.table = None
 
         columns = []
+        processed_expressions = []
         for expr, column, strname, add_element in self.\
                 _extract_col_expression_collection(expressions):
             if add_element is not None:
                 columns.append(add_element)
+            processed_expressions.append(expr)
 
-        self.expressions = expressions
+        self.expressions = processed_expressions
         self.name = quoted_name(name, kw.pop("quote", None))
         self.unique = kw.pop('unique', False)
         if 'info' in kw:
index cf7f7628a19ea815ec2f4fe76cdd50ccc25f1192..af291b8427d192ff1612b6a6d34dd88f6ff7d936 100644 (file)
@@ -2168,6 +2168,20 @@ class ConstraintTest(fixtures.TestBase):
 
         eq_(set(t.indexes), set([idx]))
 
+    def test_clauseelement_extraction_three(self):
+        t = Table('t', MetaData(), Column('x', Integer), Column('y', Integer))
+
+        expr1 = t.c.x + 5
+
+        class MyThing(object):
+            def __clause_element__(self):
+                return expr1
+
+        idx = Index('bar', MyThing(), t.c.y)
+
+        is_(idx.expressions[0], expr1)
+        is_(idx.expressions[1], t.c.y)
+
     def test_table_references(self):
         t1, t2, t3 = self._single_fixture()
         assert list(t2.c.a.foreign_keys)[0].references(t1)