| 1707 | /// Note: For building a [`RelationDesc`] see [`RelationDescBuilder::with_column`]. |
| 1708 | #[must_use] |
| 1709 | pub fn add_column<N, T>(&mut self, name: N, typ: T) -> RelationVersion |
| 1710 | where |
| 1711 | N: Into<ColumnName>, |
| 1712 | T: Into<SqlColumnType>, |
| 1713 | { |
| 1714 | let latest_version = self.latest_version(); |
| 1715 | let new_version = latest_version.bump(); |
| 1716 | |
| 1717 | let name = name.into(); |
| 1718 | let existing = self |
| 1719 | .inner |
| 1720 | .metadata |
| 1721 | .iter() |
| 1722 | .find(|(_, meta)| meta.name == name && meta.dropped.is_none()); |
| 1723 | if let Some(existing) = existing { |
| 1724 | panic!("column named '{name}' already exists! {existing:?}"); |
| 1725 | } |
| 1726 | |
| 1727 | let next_idx = self.inner.metadata.len(); |
| 1728 | let col_meta = ColumnMetadata { |
| 1729 | name, |
| 1730 | typ_idx: next_idx, |
| 1731 | added: new_version, |
| 1732 | dropped: None, |
| 1733 | }; |
| 1734 | |
| 1735 | self.inner.typ.column_types.push(typ.into()); |
| 1736 | let prev = self.inner.metadata.insert(ColumnIndex(next_idx), col_meta); |
| 1737 | |
| 1738 | assert_none!(prev, "column index overlap!"); |
| 1739 | self.validate(); |
| 1740 | |
| 1741 | new_version |
| 1742 | } |
| 1743 | |
| 1744 | /// Drops the column `name` from this [`RelationDesc`]. If there are multiple columns with |
| 1745 | /// `name` drops the left-most one that hasn't already been dropped. |