proxied
):
is_(orig_obj, proxied_obj)
+
+ def test_select_wraps_for_translate_ambiguity_dupe_cols(self):
+ # test for issue #3657
+ t = table('a', column('x'), column('y'), column('z'))
+
+ l1, l2, l3 = t.c.z.label('a'), t.c.x.label('b'), t.c.x.label('c')
+ orig = [t.c.x, t.c.y, l1, l2, l3]
+
+ # create the statement with some duplicate columns. right now
+ # the behavior is that these redundant columns are deduped.
+ stmt = select([t.c.x, t.c.y, l1, t.c.y, l2, t.c.x, l3])
+
+ # so the statement has 7 inner columns...
+ eq_(len(list(stmt.inner_columns)), 7)
+
+ # but only exposes 5 of them, the other two are dupes of x and y
+ eq_(len(stmt.c), 5)
+
+ # and when it generates a SELECT it will also render only 5
+ eq_(len(stmt._columns_plus_names), 5)
+
+ wrapped = stmt._generate()
+ wrapped = wrapped.column(
+ func.ROW_NUMBER().over(order_by=t.c.z)).alias()
+
+ # so when we wrap here we're going to have only 5 columns
+ wrapped_again = select([c for c in wrapped.c])
+
+ # so the compiler logic that matches up the "wrapper" to the
+ # "select_wraps_for" can't use inner_columns to match because
+ # these collections are not the same
+ compiled = wrapped_again.compile(
+ compile_kwargs={'select_wraps_for': stmt})
+
+ proxied = [obj[0] for (k, n, obj, type_) in compiled._result_columns]
+ for orig_obj, proxied_obj in zip(
+ orig,
+ proxied
+ ):
+ is_(orig_obj, proxied_obj)