--- /dev/null
+.. change::
+ :tags: bug, sql
+ :tickets: 4279
+
+ Fixed regression in 1.2 due to :ticket:`4147` where a :class:`.Table` that
+ has had some of its indexed columns redefined with new ones, as would occur
+ when overriding columns during reflection or when using
+ :paramref:`.Table.extend_existing`, such that the :meth:`.Table.tometadata`
+ method would fail when attempting to copy those indexes as they still
+ referred to the replaced column. The copy logic now accommodates for this
+ condition.
+
# break an import cycle
def _copy_expression(expression, source_table, target_table):
def replace(col):
- if source_table.c.contains_column(col):
+ if isinstance(col, Column) and \
+ col.table is source_table and col.key in source_table.c:
return target_table.c[col.key]
else:
return None
sorted([_get_key(i) for i in table_c.indexes])
)
+ def test_indexes_with_col_redefine(self):
+ meta = MetaData()
+
+ table = Table('mytable', meta,
+ Column('id', Integer, primary_key=True),
+ Column('data1', Integer),
+ Column('data2', Integer),
+ Index('text', text('data1 + 1')),
+ )
+ Index('multi', table.c.data1, table.c.data2)
+ Index('func', func.abs(table.c.data1))
+ Index('multi-func', table.c.data1, func.abs(table.c.data2))
+
+ table = Table('mytable', meta,
+ Column('data1', Integer),
+ Column('data2', Integer),
+ extend_existing=True
+ )
+
+ meta2 = MetaData()
+ table_c = table.tometadata(meta2)
+
+ def _get_key(i):
+ return [i.name, i.unique] + \
+ sorted(i.kwargs.items()) + \
+ [str(col) for col in i.expressions]
+
+ eq_(
+ sorted([_get_key(i) for i in table.indexes]),
+ sorted([_get_key(i) for i in table_c.indexes])
+ )
+
@emits_warning("Table '.+' already exists within the given MetaData")
def test_already_exists(self):