Skip to content

Commit 0c9451c

Browse files
committed
evolve item IDs
When running ALTER TABLE, move the table's ID to the new GlobalId, instead of leaving it at its initial value.
1 parent 844bcd5 commit 0c9451c

File tree

4 files changed

+114
-2
lines changed

4 files changed

+114
-2
lines changed

src/adapter/src/catalog/transact.rs

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -766,7 +766,46 @@ impl Catalog {
766766
};
767767
table.collections.insert(version, new_global_id);
768768

769-
tx.update_item(id, new_entry.into())?;
769+
for use_id in new_entry.referenced_by() {
770+
let mut entry = state.get_entry(use_id).clone();
771+
entry.item = entry.item.replace_item_refs(id, new_global_id);
772+
tx.update_item(*use_id, entry.into())?;
773+
}
774+
775+
let old_comment_id = CommentObjectId::Table(id);
776+
let new_comment_id = CommentObjectId::Table(new_global_id);
777+
if let Some(comments) = state.comments.get_object_comments(old_comment_id) {
778+
tx.drop_comments(&[old_comment_id].into())?;
779+
for (sub, comment) in comments {
780+
tx.update_comment(new_comment_id, *sub, Some(comment.clone()))?;
781+
}
782+
}
783+
784+
let mz_catalog::durable::Item {
785+
id,
786+
oid,
787+
global_id,
788+
schema_id,
789+
name,
790+
create_sql,
791+
owner_id,
792+
privileges,
793+
extra_versions,
794+
} = new_entry.into();
795+
796+
tx.remove_item(id)?;
797+
tx.insert_item(
798+
new_global_id,
799+
oid,
800+
global_id,
801+
schema_id,
802+
&name,
803+
create_sql,
804+
owner_id,
805+
privileges,
806+
extra_versions,
807+
)?;
808+
770809
storage_collections_to_register.insert(new_global_id, shard_id);
771810
}
772811
Op::CreateDatabase { name, owner_id } => {

src/adapter/src/coord/sequencer/inner.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5143,7 +5143,7 @@ impl Coordinator {
51435143

51445144
self.catalog_transact_with_side_effects(Some(ctx), ops, move |coord, _ctx| {
51455145
Box::pin(async move {
5146-
let entry = coord.catalog().get_entry(&relation_id);
5146+
let entry = coord.catalog().get_entry(&new_global_id);
51475147
let CatalogItem::Table(table) = &entry.item else {
51485148
panic!("programming error, expected table found {:?}", entry.item);
51495149
};

src/catalog/src/memory/objects.rs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2009,6 +2009,72 @@ impl CatalogItem {
20092009
}
20102010
}
20112011

2012+
pub fn replace_item_refs(&self, old_id: GlobalId, new_id: GlobalId) -> CatalogItem {
2013+
let do_rewrite = |create_sql: String| -> String {
2014+
let mut create_stmt = mz_sql::parse::parse(&create_sql)
2015+
.expect("invalid create sql persisted to catalog")
2016+
.into_element()
2017+
.ast;
2018+
mz_sql::ast::transform::create_stmt_replace_ids(
2019+
&mut create_stmt,
2020+
&[(old_id, new_id)].into(),
2021+
);
2022+
create_stmt.to_ast_string_stable()
2023+
};
2024+
2025+
match self {
2026+
CatalogItem::Table(i) => {
2027+
let mut i = i.clone();
2028+
i.create_sql = i.create_sql.map(do_rewrite);
2029+
CatalogItem::Table(i)
2030+
}
2031+
CatalogItem::Log(i) => CatalogItem::Log(i.clone()),
2032+
CatalogItem::Source(i) => {
2033+
let mut i = i.clone();
2034+
i.create_sql = i.create_sql.map(do_rewrite);
2035+
CatalogItem::Source(i)
2036+
}
2037+
CatalogItem::Sink(i) => {
2038+
let mut i = i.clone();
2039+
i.create_sql = do_rewrite(i.create_sql);
2040+
CatalogItem::Sink(i)
2041+
}
2042+
CatalogItem::View(i) => {
2043+
let mut i = i.clone();
2044+
i.create_sql = do_rewrite(i.create_sql);
2045+
CatalogItem::View(i)
2046+
}
2047+
CatalogItem::MaterializedView(i) => {
2048+
let mut i = i.clone();
2049+
i.create_sql = do_rewrite(i.create_sql);
2050+
CatalogItem::MaterializedView(i)
2051+
}
2052+
CatalogItem::Index(i) => {
2053+
let mut i = i.clone();
2054+
i.create_sql = do_rewrite(i.create_sql);
2055+
CatalogItem::Index(i)
2056+
}
2057+
CatalogItem::Secret(i) => {
2058+
let mut i = i.clone();
2059+
i.create_sql = do_rewrite(i.create_sql);
2060+
CatalogItem::Secret(i)
2061+
}
2062+
CatalogItem::Func(_) | CatalogItem::Type(_) => {
2063+
unimplemented!()
2064+
}
2065+
CatalogItem::Connection(i) => {
2066+
let mut i = i.clone();
2067+
i.create_sql = do_rewrite(i.create_sql);
2068+
CatalogItem::Connection(i)
2069+
}
2070+
CatalogItem::ContinualTask(i) => {
2071+
let mut i = i.clone();
2072+
i.create_sql = do_rewrite(i.create_sql);
2073+
CatalogItem::ContinualTask(i)
2074+
}
2075+
}
2076+
}
2077+
20122078
/// Updates the retain history for an item. Returns the previous retain history value. Returns
20132079
/// an error if this item does not support retain history.
20142080
pub fn update_retain_history(

src/sql-parser/src/ast/metadata.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,13 @@ impl RawItemName {
105105
RawItemName::Id(_, name, _) => name,
106106
}
107107
}
108+
109+
pub fn id_mut(&mut self) -> Option<&mut String> {
110+
match self {
111+
RawItemName::Name(_) => None,
112+
RawItemName::Id(id, _, _) => Some(id),
113+
}
114+
}
108115
}
109116

110117
impl AstDisplay for RawItemName {

0 commit comments

Comments
 (0)