(&mut self, query: SqlQuery)
| 185 | |
| 186 | impl 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 | ); |
no test coverage detected