--- /dev/null
+.. change::
+ :tags: change, sql
+
+ Altered the compilation for the :class:`.CTE` construct so that a string is
+ returned representing the inner SELECT statement if the :class:`.CTE` is
+ stringified directly, outside of the context of an enclosing SELECT; This
+ is the same behavior of :meth:`_FromClause.alias` and
+ :meth:`_SelectStatement.subquery`. Previously, a blank string would be
+ returned as the CTE is normally placed above a SELECT after that SELECT has
+ been generated, which is generally misleading when debugging.
+
kwargs["positional_names"] = self.cte_positional[cte] = []
assert kwargs.get("subquery", False) is False
- text += " AS %s\n(%s)" % (
- self._generate_prefixes(cte, cte._prefixes, **kwargs),
- cte.element._compiler_dispatch(
+
+ if not self.stack:
+ # toplevel, this is a stringify of the
+ # cte directly. just compile the inner
+ # the way alias() does.
+ return cte.element._compiler_dispatch(
+ self, asfrom=asfrom, **kwargs
+ )
+ else:
+ prefixes = self._generate_prefixes(
+ cte, cte._prefixes, **kwargs
+ )
+ inner = cte.element._compiler_dispatch(
self, asfrom=True, **kwargs
- ),
- )
+ )
+
+ text += " AS %s\n(%s)" % (prefixes, inner)
if cte._suffixes:
text += " " + self._generate_prefixes(
"SELECT anon_1.myid FROM anon_1",
)
+ @testing.combinations(("cte",), ("alias",), ("subquery",))
+ def test_grouped_selectables_print_alone(self, modifier):
+ stmt = select(table1).where(table1.c.myid == 10)
+
+ grouped = getattr(stmt, modifier)()
+ eq_ignore_whitespace(
+ str(grouped),
+ "SELECT mytable.myid, mytable.name, "
+ "mytable.description FROM mytable WHERE mytable.myid = :myid_1",
+ )
+
def test_next_sequence_value(self):
# using descriptive text that is intentionally not compatible
# with any particular backend, since all backends have different