--- /dev/null
+.. change::
+ :tags: bug, orm
+ :tickets: 10167
+
+ Fixed issue where an ORM-enabled :func:`_sql.select` construct would not
+ render any CTEs added only via the :meth:`_sql.Select.add_cte` method that
+ were not otherwise referenced in the statement.
prefixes,
suffixes,
group_by,
+ independent_ctes,
+ independent_ctes_opts,
):
statement = Select._create_raw_select(
_raw_columns=raw_columns,
statement._offset_clause = offset_clause
statement._fetch_clause = fetch_clause
statement._fetch_clause_options = fetch_clause_options
+ statement._independent_ctes = independent_ctes
+ statement._independent_ctes_opts = independent_ctes_opts
if prefixes:
statement._prefixes = prefixes
"fetch_clause_options": (
self.select_statement._fetch_clause_options
),
+ "independent_ctes": self.select_statement._independent_ctes,
+ "independent_ctes_opts": (
+ self.select_statement._independent_ctes_opts
+ ),
}
@property
else:
stmt_type.fail()
+ @testing.variation("stmt_type", ["core", "orm"])
+ def test_add_cte(self, stmt_type: testing.Variation):
+ """test #10167"""
+
+ if stmt_type.orm:
+ User = self.classes.User
+ cte_select = select(User.name).limit(1).cte()
+ cte_insert = insert(User).from_select(["name"], cte_select).cte()
+ elif stmt_type.core:
+ user_table = self.tables.users
+ cte_select = select(user_table.c.name).limit(1).cte()
+ cte_insert = (
+ insert(user_table).from_select(["name"], cte_select).cte()
+ )
+ else:
+ stmt_type.fail()
+
+ select_stmt = select(cte_select).add_cte(cte_insert)
+
+ self.assert_compile(
+ select_stmt,
+ "WITH anon_2 AS (SELECT users.name AS name FROM users LIMIT "
+ ":param_1), anon_1 AS (INSERT INTO users (name) "
+ "SELECT anon_2.name AS name FROM anon_2) "
+ "SELECT anon_2.name FROM anon_2",
+ )
+
class ColumnsClauseFromsTest(QueryTest, AssertsCompiledSQL):
__dialect__ = "default"