You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							146 lines
						
					
					
						
							4.9 KiB
						
					
					
				
			
		
		
	
	
							146 lines
						
					
					
						
							4.9 KiB
						
					
					
				from .. import fixtures
 | 
						|
from ..assertions import eq_
 | 
						|
from ..schema import Column
 | 
						|
from ..schema import Table
 | 
						|
from ... import Integer
 | 
						|
from ... import select
 | 
						|
from ... import testing
 | 
						|
from ... import union
 | 
						|
 | 
						|
 | 
						|
class DeprecatedCompoundSelectTest(fixtures.TablesTest):
 | 
						|
    __backend__ = True
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def define_tables(cls, metadata):
 | 
						|
        Table(
 | 
						|
            "some_table",
 | 
						|
            metadata,
 | 
						|
            Column("id", Integer, primary_key=True),
 | 
						|
            Column("x", Integer),
 | 
						|
            Column("y", Integer),
 | 
						|
        )
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def insert_data(cls, connection):
 | 
						|
        connection.execute(
 | 
						|
            cls.tables.some_table.insert(),
 | 
						|
            [
 | 
						|
                {"id": 1, "x": 1, "y": 2},
 | 
						|
                {"id": 2, "x": 2, "y": 3},
 | 
						|
                {"id": 3, "x": 3, "y": 4},
 | 
						|
                {"id": 4, "x": 4, "y": 5},
 | 
						|
            ],
 | 
						|
        )
 | 
						|
 | 
						|
    def _assert_result(self, conn, select, result, params=()):
 | 
						|
        eq_(conn.execute(select, params).fetchall(), result)
 | 
						|
 | 
						|
    def test_plain_union(self, connection):
 | 
						|
        table = self.tables.some_table
 | 
						|
        s1 = select(table).where(table.c.id == 2)
 | 
						|
        s2 = select(table).where(table.c.id == 3)
 | 
						|
 | 
						|
        u1 = union(s1, s2)
 | 
						|
        with testing.expect_deprecated(
 | 
						|
            "The SelectBase.c and SelectBase.columns "
 | 
						|
            "attributes are deprecated"
 | 
						|
        ):
 | 
						|
            self._assert_result(
 | 
						|
                connection, u1.order_by(u1.c.id), [(2, 2, 3), (3, 3, 4)]
 | 
						|
            )
 | 
						|
 | 
						|
    # note we've had to remove one use case entirely, which is this
 | 
						|
    # one.   the Select gets its FROMS from the WHERE clause and the
 | 
						|
    # columns clause, but not the ORDER BY, which means the old ".c" system
 | 
						|
    # allowed you to "order_by(s.c.foo)" to get an unnamed column in the
 | 
						|
    # ORDER BY without adding the SELECT into the FROM and breaking the
 | 
						|
    # query.  Users will have to adjust for this use case if they were doing
 | 
						|
    # it before.
 | 
						|
    def _dont_test_select_from_plain_union(self, connection):
 | 
						|
        table = self.tables.some_table
 | 
						|
        s1 = select(table).where(table.c.id == 2)
 | 
						|
        s2 = select(table).where(table.c.id == 3)
 | 
						|
 | 
						|
        u1 = union(s1, s2).alias().select()
 | 
						|
        with testing.expect_deprecated(
 | 
						|
            "The SelectBase.c and SelectBase.columns "
 | 
						|
            "attributes are deprecated"
 | 
						|
        ):
 | 
						|
            self._assert_result(
 | 
						|
                connection, u1.order_by(u1.c.id), [(2, 2, 3), (3, 3, 4)]
 | 
						|
            )
 | 
						|
 | 
						|
    @testing.requires.order_by_col_from_union
 | 
						|
    @testing.requires.parens_in_union_contained_select_w_limit_offset
 | 
						|
    def test_limit_offset_selectable_in_unions(self, connection):
 | 
						|
        table = self.tables.some_table
 | 
						|
        s1 = select(table).where(table.c.id == 2).limit(1).order_by(table.c.id)
 | 
						|
        s2 = select(table).where(table.c.id == 3).limit(1).order_by(table.c.id)
 | 
						|
 | 
						|
        u1 = union(s1, s2).limit(2)
 | 
						|
        with testing.expect_deprecated(
 | 
						|
            "The SelectBase.c and SelectBase.columns "
 | 
						|
            "attributes are deprecated"
 | 
						|
        ):
 | 
						|
            self._assert_result(
 | 
						|
                connection, u1.order_by(u1.c.id), [(2, 2, 3), (3, 3, 4)]
 | 
						|
            )
 | 
						|
 | 
						|
    @testing.requires.parens_in_union_contained_select_wo_limit_offset
 | 
						|
    def test_order_by_selectable_in_unions(self, connection):
 | 
						|
        table = self.tables.some_table
 | 
						|
        s1 = select(table).where(table.c.id == 2).order_by(table.c.id)
 | 
						|
        s2 = select(table).where(table.c.id == 3).order_by(table.c.id)
 | 
						|
 | 
						|
        u1 = union(s1, s2).limit(2)
 | 
						|
        with testing.expect_deprecated(
 | 
						|
            "The SelectBase.c and SelectBase.columns "
 | 
						|
            "attributes are deprecated"
 | 
						|
        ):
 | 
						|
            self._assert_result(
 | 
						|
                connection, u1.order_by(u1.c.id), [(2, 2, 3), (3, 3, 4)]
 | 
						|
            )
 | 
						|
 | 
						|
    def test_distinct_selectable_in_unions(self, connection):
 | 
						|
        table = self.tables.some_table
 | 
						|
        s1 = select(table).where(table.c.id == 2).distinct()
 | 
						|
        s2 = select(table).where(table.c.id == 3).distinct()
 | 
						|
 | 
						|
        u1 = union(s1, s2).limit(2)
 | 
						|
        with testing.expect_deprecated(
 | 
						|
            "The SelectBase.c and SelectBase.columns "
 | 
						|
            "attributes are deprecated"
 | 
						|
        ):
 | 
						|
            self._assert_result(
 | 
						|
                connection, u1.order_by(u1.c.id), [(2, 2, 3), (3, 3, 4)]
 | 
						|
            )
 | 
						|
 | 
						|
    def test_limit_offset_aliased_selectable_in_unions(self, connection):
 | 
						|
        table = self.tables.some_table
 | 
						|
        s1 = (
 | 
						|
            select(table)
 | 
						|
            .where(table.c.id == 2)
 | 
						|
            .limit(1)
 | 
						|
            .order_by(table.c.id)
 | 
						|
            .alias()
 | 
						|
            .select()
 | 
						|
        )
 | 
						|
        s2 = (
 | 
						|
            select(table)
 | 
						|
            .where(table.c.id == 3)
 | 
						|
            .limit(1)
 | 
						|
            .order_by(table.c.id)
 | 
						|
            .alias()
 | 
						|
            .select()
 | 
						|
        )
 | 
						|
 | 
						|
        u1 = union(s1, s2).limit(2)
 | 
						|
        with testing.expect_deprecated(
 | 
						|
            "The SelectBase.c and SelectBase.columns "
 | 
						|
            "attributes are deprecated"
 | 
						|
        ):
 | 
						|
            self._assert_result(
 | 
						|
                connection, u1.order_by(u1.c.id), [(2, 2, 3), (3, 3, 4)]
 | 
						|
            )
 |