summaryrefslogtreecommitdiff
path: root/test/sql/test_join_rewriting.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/sql/test_join_rewriting.py')
-rw-r--r--test/sql/test_join_rewriting.py156
1 files changed, 137 insertions, 19 deletions
diff --git a/test/sql/test_join_rewriting.py b/test/sql/test_join_rewriting.py
index a966af4e4..573455e7d 100644
--- a/test/sql/test_join_rewriting.py
+++ b/test/sql/test_join_rewriting.py
@@ -7,6 +7,7 @@ from sqlalchemy import Column
from sqlalchemy import exists
from sqlalchemy import ForeignKey
from sqlalchemy import Integer
+from sqlalchemy import literal_column
from sqlalchemy import MetaData
from sqlalchemy import select
from sqlalchemy import Table
@@ -14,10 +15,11 @@ from sqlalchemy import testing
from sqlalchemy import union
from sqlalchemy import util
from sqlalchemy.engine import default
+from sqlalchemy.sql import elements
from sqlalchemy.testing import AssertsCompiledSQL
+from sqlalchemy.testing import eq_
from sqlalchemy.testing import fixtures
-
m = MetaData()
@@ -92,11 +94,15 @@ class _JoinRewriteTestBase(AssertsCompiledSQL):
compiled = s.compile(dialect=self.__dialect__)
- # column name should be in result map, as we never render
- # .key in SQL
- for key, col in zip([c.name for c in s.subquery().c], s.inner_columns):
- key = key % compiled.anon_map
- assert col in compiled._create_result_map()[key][1]
+ for rec, (name, col) in zip(
+ compiled._result_columns, s._columns_plus_names
+ ):
+ assert col in set(rec[2])
+ if (
+ not isinstance(name, elements._anonymous_label)
+ and name is not None
+ ):
+ eq_(rec[1], name)
_a_bkeyselect_bkey = ""
@@ -128,6 +134,48 @@ class _JoinRewriteTestBase(AssertsCompiledSQL):
self._test(s, self._a_bc)
+ def test_a_bc_preserve_dupes(self):
+ j1 = b.join(c)
+ j2 = a.join(j1)
+
+ s = (
+ select(
+ [a.c.id, b.c.id, b.c.a_id, c, b.c.a_id, c.c.b_id],
+ use_labels=True,
+ )
+ .select_from(j2)
+ .where(b.c.id == 2)
+ .where(c.c.id == 3)
+ .order_by(a.c.id, b.c.id, c.c.id)
+ )
+
+ self._test(s, self._a_bc_wdupes)
+
+ def test_a_bc_preserve_dupes_anon_map(self):
+ j1 = b.join(c)
+ j2 = a.join(j1)
+
+ s = (
+ select(
+ [a.c.id, b.c.id, b.c.a_id, c, b.c.a_id, c.c.b_id],
+ use_labels=True,
+ )
+ .select_from(j2)
+ .where(b.c.id == 2)
+ .where(c.c.id == 3)
+ )
+
+ # the anon_map needs to be preserved after the transform
+ # as the labels are going to be referred to outside of the query
+ subq = s.subquery()
+ s2 = (
+ select([literal_column("1")])
+ .select_from(subq)
+ .where(subq.c[5] == subq.c[6])
+ )
+
+ self._test(s2, self._a_bc_wdupes_anon_map)
+
def test_a_bkeyassoc(self):
j1 = b_key.join(a_to_b_key)
j2 = a.join(j1)
@@ -311,6 +359,35 @@ class JoinRewriteTest(_JoinRewriteTestBase, fixtures.TestBase):
"ORDER BY a.id, anon_1.b_id, anon_1.c_id"
)
+ _a_bc_wdupes = (
+ "SELECT a.id AS a_id, anon_1.b_id AS b_id, anon_1.b_a_id AS b_a_id, "
+ "anon_1.c_id AS c_id, anon_1.c_b_id AS c_b_id, "
+ "anon_1.b_a_id AS b_a_id_1, anon_1.c_b_id AS c_b_id_1 "
+ "FROM a JOIN "
+ "(SELECT b.id AS b_id, b.a_id AS b_a_id, c.id AS c_id, "
+ "c.b_id AS c_b_id "
+ "FROM b JOIN c ON b.id = c.b_id) AS anon_1 ON a.id = anon_1.b_a_id "
+ "WHERE anon_1.b_id = :id_1 AND anon_1.c_id = :id_2 "
+ "ORDER BY a.id, anon_1.b_id, anon_1.c_id"
+ )
+
+ _a_bc_wdupes_anon_map = (
+ "SELECT 1 FROM (SELECT a.id AS a_id, b.id AS b_id, b.a_id AS b_a_id, "
+ "c.id AS c_id, c.b_id AS c_b_id, b.a_id AS b_a_id_1, "
+ "c.b_id AS c_b_id_1 "
+ "FROM a JOIN (b JOIN c ON b.id = c.b_id) ON a.id = b.a_id "
+ "WHERE b.id = :id_1 AND c.id = :id_2) AS anon_1 "
+ "WHERE anon_1.b_a_id_1 = anon_1.c_b_id_1"
+ )
+
+ _a_bc_wdupes_anon_map = (
+ "SELECT 1 FROM (SELECT a.id AS a_id, b.id AS b_id, b.a_id AS b_a_id, "
+ "c.id AS c_id, c.b_id AS c_b_id, b.a_id AS b_a_id_1, "
+ "c.b_id AS c_b_id_1 FROM a JOIN (b JOIN c ON b.id = c.b_id) "
+ "ON a.id = b.a_id WHERE b.id = :id_1 AND c.id = :id_2) AS anon_1 "
+ "WHERE anon_1.b_a_id_1 = anon_1.c_b_id_1"
+ )
+
_a_bc_comma_a1_selbc = (
"SELECT a.id AS a_id, a_1.id AS a_1_id, anon_1.b_id AS b_id, "
"anon_1.b_a_id AS b_a_id, anon_1.c_id AS c_id, "
@@ -346,15 +423,14 @@ class JoinRewriteTest(_JoinRewriteTestBase, fixtures.TestBase):
)
_a_bkeyselect_bkey = (
- "SELECT a.id AS a_id, anon_2.anon_1_aid AS anon_1_aid, "
- "anon_2.anon_1_bid AS anon_1_bid, anon_2.b_key_id AS b_key_id "
- "FROM a JOIN (SELECT anon_1.aid AS anon_1_aid, "
- "anon_1.bid AS anon_1_bid, "
+ "SELECT a.id AS a_id, anon_1.b_key_id AS b_key_id "
+ "FROM a JOIN (SELECT anon_2.aid AS anon_2_aid, "
+ "anon_2.bid AS anon_2_bid, "
"b_key.id AS b_key_id "
"FROM (SELECT a_to_b_key.aid AS aid, a_to_b_key.bid AS bid "
- "FROM a_to_b_key) AS anon_1 "
- "JOIN b_key ON b_key.id = anon_1.bid) AS anon_2 "
- "ON a.id = anon_2.anon_1_aid"
+ "FROM a_to_b_key) AS anon_2 "
+ "JOIN b_key ON b_key.id = anon_2.bid) AS anon_1 "
+ "ON a.id = anon_1.anon_2_aid"
)
_a_atobalias_balias_c_w_exists = (
@@ -400,8 +476,8 @@ class JoinRewriteTest(_JoinRewriteTestBase, fixtures.TestBase):
_b_a_id_double_overlap_annotated = (
"SELECT anon_1.b_id AS anon_1_b_id, anon_1.b_a_id AS anon_1_b_a_id, "
- "anon_1.id_1 AS anon_1_id_1 "
- "FROM (SELECT b.id AS b_id, b.a_id AS b_a_id, b_a.id AS id_1 "
+ "anon_1.b_a_id_1 AS anon_1_b_a_id_1 "
+ "FROM (SELECT b.id AS b_id, b.a_id AS b_a_id, b_a.id AS b_a_id_2 "
"FROM b JOIN b_a ON b.id = b_a.id) AS anon_1"
)
@@ -433,6 +509,7 @@ class JoinPlainTest(_JoinRewriteTestBase, fixtures.TestBase):
"FROM a_to_b_key) AS anon_1 JOIN b_key ON b_key.id = anon_1.bid) "
"ON a.id = anon_1.aid"
)
+
_a__b_dc = (
"SELECT a.id AS a_id, b.id AS b_id, "
"b.a_id AS b_a_id, c.id AS c_id, "
@@ -455,6 +532,25 @@ class JoinPlainTest(_JoinRewriteTestBase, fixtures.TestBase):
"ORDER BY a.id, b.id, c.id"
)
+ _a_bc_wdupes = (
+ "SELECT a.id AS a_id, b.id AS b_id, b.a_id AS b_a_id, c.id AS c_id, "
+ "c.b_id AS c_b_id, b.a_id AS b_a_id_1, c.b_id AS c_b_id_1 "
+ "FROM a JOIN "
+ "(b JOIN c ON b.id = c.b_id) "
+ "ON a.id = b.a_id "
+ "WHERE b.id = :id_1 AND c.id = :id_2 "
+ "ORDER BY a.id, b.id, c.id"
+ )
+
+ _a_bc_wdupes_anon_map = (
+ "SELECT 1 FROM (SELECT a.id AS a_id, b.id AS b_id, b.a_id AS b_a_id, "
+ "c.id AS c_id, c.b_id AS c_b_id, b.a_id AS b_a_id_1, "
+ "c.b_id AS c_b_id_1 "
+ "FROM a JOIN (b JOIN c ON b.id = c.b_id) ON a.id = b.a_id "
+ "WHERE b.id = :id_1 AND c.id = :id_2) AS anon_1 "
+ "WHERE anon_1.b_a_id_1 = anon_1.c_b_id_1"
+ )
+
_a_bc_comma_a1_selbc = (
"SELECT a.id AS a_id, a_1.id AS a_1_id, b.id AS b_id, "
"b.a_id AS b_a_id, c.id AS c_id, "
@@ -517,8 +613,8 @@ class JoinPlainTest(_JoinRewriteTestBase, fixtures.TestBase):
_b_a_id_double_overlap_annotated = (
"SELECT anon_1.b_id AS anon_1_b_id, anon_1.b_a_id AS anon_1_b_a_id, "
- "anon_1.id_1 AS anon_1_id_1 FROM "
- "(SELECT b.id AS b_id, b.a_id AS b_a_id, b_a.id AS id_1 "
+ "anon_1.b_a_id_1 AS anon_1_b_a_id_1 FROM "
+ "(SELECT b.id AS b_id, b.a_id AS b_a_id, b_a.id AS b_a_id_1 "
"FROM b JOIN b_a ON b.id = b_a.id) AS anon_1"
)
@@ -573,6 +669,24 @@ class JoinNoUseLabelsTest(_JoinRewriteTestBase, fixtures.TestBase):
"ORDER BY a.id, b.id, c.id"
)
+ _a_bc_wdupes = (
+ "SELECT a.id, b.id, b.a_id, c.id, c.b_id, b.a_id, c.b_id "
+ "FROM a JOIN "
+ "(b JOIN c ON b.id = c.b_id) "
+ "ON a.id = b.a_id "
+ "WHERE b.id = :id_1 AND c.id = :id_2 "
+ "ORDER BY a.id, b.id, c.id"
+ )
+
+ _a_bc_wdupes_anon_map = (
+ "SELECT 1 FROM (SELECT a.id AS a_id, b.id AS b_id, b.a_id AS b_a_id, "
+ "c.id AS c_id, c.b_id AS c_b_id, b.a_id AS b_a_id_1, "
+ "c.b_id AS c_b_id_1 "
+ "FROM a JOIN (b JOIN c ON b.id = c.b_id) ON a.id = b.a_id "
+ "WHERE b.id = :id_1 AND c.id = :id_2) AS anon_1 "
+ "WHERE anon_1.b_a_id_1 = anon_1.c_b_id_1"
+ )
+
_a_bc_comma_a1_selbc = (
"SELECT a.id, a_1.id, b.id, "
"b.a_id, c.id, "
@@ -626,8 +740,8 @@ class JoinNoUseLabelsTest(_JoinRewriteTestBase, fixtures.TestBase):
)
_b_a_id_double_overlap_annotated = (
- "SELECT anon_1.b_id, anon_1.b_a_id, anon_1.id_1 FROM "
- "(SELECT b.id AS b_id, b.a_id AS b_a_id, b_a.id AS id_1 "
+ "SELECT anon_1.b_id, anon_1.b_a_id, anon_1.b_a_id_1 FROM "
+ "(SELECT b.id AS b_id, b.a_id AS b_a_id, b_a.id AS b_a_id_1 "
"FROM b JOIN b_a ON b.id = b_a.id) AS anon_1"
)
@@ -650,6 +764,10 @@ class JoinExecTest(_JoinRewriteTestBase, fixtures.TestBase):
__backend__ = True
_a_bc = (
+ _a_bc_wdupes
+ ) = (
+ _a_bc_wdupes_anon_map
+ ) = (
_a_bc_comma_a1_selbc
) = (
_a__b_dc