from sqlalchemy import Table
from sqlalchemy import testing
from sqlalchemy import true
+from sqlalchemy import union
from sqlalchemy.engine import default
from sqlalchemy.orm import aliased
from sqlalchemy.orm import backref
"JOIN addresses ON users.id = addresses.user_id",
)
+ @testing.combinations((True,), (False,), argnames="legacy")
+ @testing.combinations((True,), (False,), argnames="threelevel")
+ def test_join_and_union_with_entities(self, legacy, threelevel):
+ """test issue #6698, regression caused by #6503"""
+
+ User, Address, Dingaling = self.classes("User", "Address", "Dingaling")
+
+ if legacy:
+ sess = fixture_session()
+ stmt = sess.query(User).join(Address).with_entities(Address.id)
+ else:
+ stmt = select(User).join(Address).with_only_columns(Address.id)
+
+ stmt = stmt.set_label_style(LABEL_STYLE_TABLENAME_PLUS_COL)
+
+ if threelevel:
+ if legacy:
+ stmt = stmt.join(Address.dingaling).with_entities(Dingaling.id)
+
+ to_union = sess.query(Dingaling.id)
+ else:
+ stmt = stmt.join(Address.dingaling).with_only_columns(
+ Dingaling.id
+ )
+ to_union = select(Dingaling.id).set_label_style(
+ LABEL_STYLE_TABLENAME_PLUS_COL
+ )
+ else:
+ if legacy:
+ to_union = sess.query(Address.id)
+ else:
+ to_union = select(Address.id).set_label_style(
+ LABEL_STYLE_TABLENAME_PLUS_COL
+ )
+
+ if legacy:
+ stmt = stmt.union(to_union)
+ else:
+ stmt = (
+ union(stmt, to_union)
+ .subquery()
+ .select()
+ .set_label_style(LABEL_STYLE_TABLENAME_PLUS_COL)
+ )
+
+ if threelevel:
+ self.assert_compile(
+ stmt,
+ "SELECT anon_1.dingalings_id AS anon_1_dingalings_id FROM "
+ "(SELECT dingalings.id AS dingalings_id "
+ "FROM users JOIN addresses ON users.id = addresses.user_id "
+ "JOIN dingalings ON addresses.id = dingalings.address_id "
+ "UNION "
+ "SELECT dingalings.id AS dingalings_id FROM dingalings) "
+ "AS anon_1",
+ )
+ else:
+ self.assert_compile(
+ stmt,
+ "SELECT anon_1.addresses_id AS anon_1_addresses_id FROM "
+ "(SELECT addresses.id AS addresses_id FROM users "
+ "JOIN addresses ON users.id = addresses.user_id "
+ "UNION "
+ "SELECT addresses.id AS addresses_id FROM addresses) "
+ "AS anon_1",
+ )
+
def test_invalid_kwarg_join(self):
User = self.classes.User
sess = fixture_session()
from sqlalchemy import String
from sqlalchemy import Table
from sqlalchemy import tuple_
+from sqlalchemy import union
from sqlalchemy.sql import column
from sqlalchemy.sql import table
from sqlalchemy.testing import assert_raises_message
"JOIN child ON parent.id = child.parent_id",
)
+ def test_join_implicit_left_side_wo_cols_onelevel_union(self):
+ """test issue #6698, regression from #6503.
+
+ this issue didn't affect Core but testing it here anyway."""
+ stmt = select(parent).join(child).with_only_columns(child.c.id)
+
+ stmt = stmt.union(select(child.c.id))
+ self.assert_compile(
+ stmt,
+ "SELECT child.id FROM parent "
+ "JOIN child ON parent.id = child.parent_id "
+ "UNION "
+ "SELECT child.id FROM child",
+ )
+
def test_join_implicit_left_side_wo_cols_twolevel(self):
"""test issue #6503"""
stmt = (
"JOIN grandchild ON child.id = grandchild.child_id",
)
+ def test_join_implicit_left_side_wo_cols_twolevel_union(self):
+ """test issue #6698, regression from #6503.
+
+ this issue didn't affect Core but testing it here anyway."""
+ stmt = (
+ select(parent)
+ .join(child)
+ .with_only_columns(child.c.id)
+ .join(grandchild)
+ .with_only_columns(grandchild.c.id)
+ )
+
+ stmt = union(stmt, select(grandchild.c.id))
+ self.assert_compile(
+ stmt,
+ "SELECT grandchild.id FROM parent "
+ "JOIN child ON parent.id = child.parent_id "
+ "JOIN grandchild ON child.id = grandchild.child_id "
+ "UNION "
+ "SELECT grandchild.id FROM grandchild",
+ )
+
def test_right_nested_inner_join(self):
inner = child.join(grandchild)