diff options
Diffstat (limited to 'test/sql/test_compiler.py')
-rw-r--r-- | test/sql/test_compiler.py | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/test/sql/test_compiler.py b/test/sql/test_compiler.py index 1c5dc2340..041cd37b6 100644 --- a/test/sql/test_compiler.py +++ b/test/sql/test_compiler.py @@ -3878,3 +3878,43 @@ class ResultMapTest(fixtures.TestBase): 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) |