Skip to content

Commit b4c49bb

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 cb60c0f commit b4c49bb

File tree

4 files changed

+105
-2
lines changed

4 files changed

+105
-2
lines changed

src/adapter/src/catalog/transact.rs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -766,7 +766,37 @@ 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 mz_catalog::durable::Item {
776+
id,
777+
oid,
778+
global_id,
779+
schema_id,
780+
name,
781+
create_sql,
782+
owner_id,
783+
privileges,
784+
extra_versions,
785+
} = new_entry.into();
786+
787+
tx.remove_item(id)?;
788+
tx.insert_item(
789+
new_global_id,
790+
oid,
791+
global_id,
792+
schema_id,
793+
&name,
794+
create_sql,
795+
owner_id,
796+
privileges,
797+
extra_versions,
798+
)?;
799+
770800
storage_collections_to_register.insert(new_global_id, shard_id);
771801
}
772802
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)