--- /dev/null
+.. change::
+ :tags: bug, sql
+
+ Changed the text of the exception for "Can't resolve label reference" to
+ include other kinds of label coercions, namely that "DISTINCT" is also in
+ this category under the PostgreSQL dialect.
+
elements._no_text_coercion(
element.element,
exc.CompileError,
- "Can't resolve label reference for ORDER BY / GROUP BY.",
+ "Can't resolve label reference for ORDER BY / "
+ "GROUP BY / DISTINCT etc.",
)
else:
kwargs["render_label_as_label"] = col
dialect="postgresql",
)
+ def test_columns_augmented_sql_three_using_label_reference(self):
+ User, Address = self.classes.User, self.classes.Address
+
+ sess = create_session()
+
+ q = (
+ sess.query(User.id, User.name.label("foo"), Address.id)
+ .distinct("name")
+ .order_by(User.id, User.name, Address.email_address)
+ )
+
+ # no columns are added when DISTINCT ON is used
+ self.assert_compile(
+ q,
+ "SELECT DISTINCT ON (users.name) users.id AS users_id, "
+ "users.name AS foo, addresses.id AS addresses_id FROM users, "
+ "addresses ORDER BY users.id, users.name, addresses.email_address",
+ dialect="postgresql",
+ )
+
+ def test_columns_augmented_sql_illegal_label_reference(self):
+ User, Address = self.classes.User, self.classes.Address
+
+ sess = create_session()
+
+ q = sess.query(User.id, User.name.label("foo"), Address.id).distinct(
+ "not a label"
+ )
+
+ from sqlalchemy.dialects import postgresql
+
+ assert_raises_message(
+ sa_exc.CompileError,
+ "Can't resolve label reference for ORDER BY / "
+ "GROUP BY / DISTINCT etc.",
+ q.with_labels().statement.compile,
+ dialect=postgresql.dialect(),
+ )
+
def test_columns_augmented_sql_four(self):
User, Address = self.classes.User, self.classes.Address
class OrderByLabelResolutionTest(fixtures.TestBase, AssertsCompiledSQL):
__dialect__ = "default"
- def _test_exception(self, stmt, offending_clause):
+ def _test_exception(self, stmt, offending_clause, dialect=None):
assert_raises_message(
exc.CompileError,
- r"Can't resolve label reference for ORDER BY / GROUP BY. "
+ r"Can't resolve label reference for ORDER BY / GROUP BY / "
+ "DISTINCT etc. "
"Textual SQL "
"expression %r should be explicitly "
r"declared as text\(%r\)" % (offending_clause, offending_clause),
stmt.compile,
+ dialect=dialect,
)
def test_order_by_label(self):
stmt = select([table1.c.myid]).order_by("foobar")
self._test_exception(stmt, "foobar")
+ def test_distinct_label(self):
+
+ stmt = select([table1.c.myid.label("foo")]).distinct("foo")
+ self.assert_compile(
+ stmt,
+ "SELECT DISTINCT ON (foo) mytable.myid AS foo FROM mytable",
+ dialect="postgresql",
+ )
+
+ def test_unresolvable_distinct_label(self):
+ from sqlalchemy.dialects import postgresql
+
+ stmt = select([table1.c.myid.label("foo")]).distinct("not a label")
+ self._test_exception(stmt, "not a label", dialect=postgresql.dialect())
+
def test_group_by_label(self):
stmt = select([table1.c.myid.label("foo")]).group_by("foo")
self.assert_compile(
assert_raises_message(
exc.CompileError,
- r"Can't resolve label reference for ORDER BY / GROUP BY. "
+ r"Can't resolve label reference for ORDER BY / GROUP BY / "
+ "DISTINCT etc. "
"Textual SQL "
"expression 't1name' should be explicitly "
r"declared as text\('t1name'\)",