From 32fa2ac3ee3914ffaaa1ba9a0065d3e54602e5ab Mon Sep 17 00:00:00 2001 From: Nikita Sivukhin Date: Sun, 6 Jul 2025 22:24:35 +0400 Subject: [PATCH] avoid capturing changes in cdc table --- core/translate/insert.rs | 24 ++++++++++++++---------- core/translate/main_loop.rs | 29 ++++++++++++++++------------- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/core/translate/insert.rs b/core/translate/insert.rs index cba811387..702a7a290 100644 --- a/core/translate/insert.rs +++ b/core/translate/insert.rs @@ -119,16 +119,20 @@ pub fn translate_insert( let cdc_table = program.capture_data_changes_mode().table(); let cdc_table = if let Some(cdc_table) = cdc_table { - let Some(turso_cdc_table) = schema.get_table(&cdc_table) else { - crate::bail_parse_error!("no such table: {}", cdc_table); - }; - let Some(cdc_btree) = turso_cdc_table.btree().clone() else { - crate::bail_parse_error!("no such table: {}", cdc_table); - }; - Some(( - program.alloc_cursor_id(CursorType::BTreeTable(cdc_btree.clone())), - cdc_btree, - )) + if table.get_name() != cdc_table { + let Some(turso_cdc_table) = schema.get_table(&cdc_table) else { + crate::bail_parse_error!("no such table: {}", cdc_table); + }; + let Some(cdc_btree) = turso_cdc_table.btree().clone() else { + crate::bail_parse_error!("no such table: {}", cdc_table); + }; + Some(( + program.alloc_cursor_id(CursorType::BTreeTable(cdc_btree.clone())), + cdc_btree, + )) + } else { + None + } } else { None }; diff --git a/core/translate/main_loop.rs b/core/translate/main_loop.rs index dcb04198f..252eb193a 100644 --- a/core/translate/main_loop.rs +++ b/core/translate/main_loop.rs @@ -125,20 +125,23 @@ pub fn init_loop( OperationMode::INSERT | OperationMode::UPDATE | OperationMode::DELETE ) { + assert!(tables.joined_tables().len() == 1); let cdc_table_name = cdc_table.unwrap(); - let Some(cdc_table) = t_ctx.resolver.schema.get_table(cdc_table_name) else { - crate::bail_parse_error!("no such table: {}", cdc_table_name); - }; - let Some(cdc_btree) = cdc_table.btree().clone() else { - crate::bail_parse_error!("no such table: {}", cdc_table_name); - }; - let cdc_cursor_id = program.alloc_cursor_id(CursorType::BTreeTable(cdc_btree.clone())); - program.emit_insn(Insn::OpenWrite { - cursor_id: cdc_cursor_id, - root_page: cdc_btree.root_page.into(), - name: cdc_btree.name.clone(), - }); - t_ctx.cdc_cursor_id = Some(cdc_cursor_id); + if tables.joined_tables()[0].table.get_name() != cdc_table_name { + let Some(cdc_table) = t_ctx.resolver.schema.get_table(cdc_table_name) else { + crate::bail_parse_error!("no such table: {}", cdc_table_name); + }; + let Some(cdc_btree) = cdc_table.btree().clone() else { + crate::bail_parse_error!("no such table: {}", cdc_table_name); + }; + let cdc_cursor_id = program.alloc_cursor_id(CursorType::BTreeTable(cdc_btree.clone())); + program.emit_insn(Insn::OpenWrite { + cursor_id: cdc_cursor_id, + root_page: cdc_btree.root_page.into(), + name: cdc_btree.name.clone(), + }); + t_ctx.cdc_cursor_id = Some(cdc_cursor_id); + } } // Initialize ephemeral indexes for distinct aggregates