MCPcopy Create free account
hub / github.com/PRQL/prql / fold_sql_query

Method fold_sql_query

prqlc/prqlc/src/sql/pq/postprocess.rs:187–309  ·  view source on GitHub ↗
(&mut self, query: SqlQuery)

Source from the content-addressed store, hash-verified

185
186impl PqFold for SortingInference<'_> {
187 fn fold_sql_query(&mut self, query: SqlQuery) -> Result<SqlQuery> {
188 let mut ctes = Vec::with_capacity(query.ctes.len());
189
190 for cte in query.ctes {
191 log::debug!("infer_sorts: {0:?}", cte.tid);
192
193 let last_select_before_fold = find_last_select_for_cte(&cte).cloned();
194 let cte = self.fold_cte(cte)?;
195 let last_select_after_fold = find_last_select_for_cte(&cte);
196
197 // Checking if CTE folding has added some new columns to the CTE
198 match (last_select_before_fold.as_ref(), last_select_after_fold) {
199 (Some(before), Some(after)) if before != after => {
200 let new_columns = after
201 .iter()
202 .filter(|cid| !before.contains(cid))
203 .collect::<Vec<_>>();
204
205 // if new columns are added, the relation instance needs to be updated
206 if !new_columns.is_empty() {
207 let mut cid_redirects_to_add = Vec::new();
208 for old_cid in new_columns {
209 let new_cid = self.ctx.anchor.cid.gen();
210 let name = self.ctx.anchor.ensure_column_name(*old_cid).cloned();
211 if let Some(name) = name.clone() {
212 self.ctx.anchor.column_names.insert(new_cid, name);
213 }
214
215 let old_def = self.ctx.anchor.column_decls.get(old_cid).unwrap();
216 let col = match old_def {
217 ColumnDecl::RelationColumn(_, _, RelationColumn::Wildcard) => {
218 RelationColumn::Wildcard
219 }
220 _ => RelationColumn::Single(name),
221 };
222
223 cid_redirects_to_add.push((*old_cid, new_cid, col));
224 }
225
226 let (riid, relation_instance) = self
227 .ctx
228 .anchor
229 .relation_instances
230 .iter_mut()
231 .find(|(_riid, rel_inst)| rel_inst.table_ref.source == cte.tid)
232 .unwrap();
233
234 cid_redirects_to_add
235 .into_iter()
236 .for_each(|(old_cid, new_cid, col)| {
237 let def = ColumnDecl::RelationColumn(*riid, new_cid, col);
238
239 self.ctx.anchor.column_decls.insert(new_cid, def);
240 log::debug!(
241 "-- redirecting {old_cid:?} to {new_cid:?} for CTE {cte:?} (RIId: {riid:?})",
242 cte = cte.tid,
243 riid = riid
244 );

Callers 2

infer_sortsFunction · 0.45
assign_namesFunction · 0.45

Calls 15

find_last_select_for_cteFunction · 0.85
RelationColumnEnum · 0.85
lenMethod · 0.80
fold_cteMethod · 0.80
iterMethod · 0.80
is_emptyMethod · 0.80
genMethod · 0.80
ensure_column_nameMethod · 0.80
pushMethod · 0.80
into_iterMethod · 0.80
alias_last_sortingMethod · 0.80
insertMethod · 0.45

Tested by

no test coverage detected