diff --git a/core/translate/planner.rs b/core/translate/planner.rs index 0cf355c01..08936abf3 100644 --- a/core/translate/planner.rs +++ b/core/translate/planner.rs @@ -317,11 +317,26 @@ fn parse_from_clause_table( ) } ast::SelectTable::Select(subselect, maybe_alias) => { + let outer_query_refs_for_subquery = table_references + .outer_query_refs() + .iter() + .cloned() + .chain( + ctes.iter() + .cloned() + .map(|t: JoinedTable| OuterQueryReference { + identifier: t.identifier, + internal_id: t.internal_id, + table: t.table, + col_used_mask: ColumnUsedMask::default(), + }), + ) + .collect::>(); let Plan::Select(subplan) = prepare_select_plan( subselect, resolver, program, - table_references.outer_query_refs(), + &outer_query_refs_for_subquery, QueryDestination::placeholder_for_subquery(), connection, )? diff --git a/testing/subquery.test b/testing/subquery.test index 98ecec001..3a909df34 100644 --- a/testing/subquery.test +++ b/testing/subquery.test @@ -433,3 +433,17 @@ do_execsql_test subquery-count-all { where u.id < 100 ); } {1089} + +do_execsql_test_on_specific_db {:memory:} subquery-cte-available-in-arbitrary-depth { + with cte as (select 1 as one) + select onehundredandeleven+1 as onehundredandtwelve + from ( + with cte2 as (select 10 as ten) + select onehundredandone+ten as onehundredandeleven + from ( + with cte3 as (select 100 as hundred) + select one+hundred as onehundredandone + from cte join cte3 + ) join cte2 + ); +} {112} \ No newline at end of file