diff --git a/core/incremental/compiler.rs b/core/incremental/compiler.rs index 15794068b..f067515cc 100644 --- a/core/incremental/compiler.rs +++ b/core/incremental/compiler.rs @@ -2247,7 +2247,9 @@ mod tests { unique_sets: vec![], foreign_keys: vec![], }; - schema.add_btree_table(Arc::new(users_table)); + schema + .add_btree_table(Arc::new(users_table)) + .expect("Test setup: failed to add users table"); // Add products table for join tests let products_table = BTreeTable { @@ -2301,7 +2303,9 @@ mod tests { unique_sets: vec![], foreign_keys: vec![], }; - schema.add_btree_table(Arc::new(products_table)); + schema + .add_btree_table(Arc::new(products_table)) + .expect("Test setup: failed to add products table"); // Add orders table for join tests let orders_table = BTreeTable { @@ -2367,7 +2371,9 @@ mod tests { unique_sets: vec![], foreign_keys: vec![], }; - schema.add_btree_table(Arc::new(orders_table)); + schema + .add_btree_table(Arc::new(orders_table)) + .expect("Test setup: failed to add orders table"); // Add customers table with id and name for testing column ambiguity let customers_table = BTreeTable { @@ -2406,7 +2412,9 @@ mod tests { unique_sets: vec![], foreign_keys: vec![], }; - schema.add_btree_table(Arc::new(customers_table)); + schema + .add_btree_table(Arc::new(customers_table)) + .expect("Test setup: failed to add customers table"); // Add purchases table (junction table for three-way join) let purchases_table = BTreeTable { @@ -2469,7 +2477,9 @@ mod tests { unique_sets: vec![], foreign_keys: vec![], }; - schema.add_btree_table(Arc::new(purchases_table)); + schema + .add_btree_table(Arc::new(purchases_table)) + .expect("Test setup: failed to add purchases table"); // Add vendors table with id, name, and price (ambiguous columns with customers) let vendors_table = BTreeTable { @@ -2520,7 +2530,9 @@ mod tests { unique_sets: vec![], foreign_keys: vec![], }; - schema.add_btree_table(Arc::new(vendors_table)); + schema + .add_btree_table(Arc::new(vendors_table)) + .expect("Test setup: failed to add vendors table"); let sales_table = BTreeTable { name: "sales".to_string(), @@ -2558,7 +2570,9 @@ mod tests { unique_sets: vec![], foreign_keys: vec![], }; - schema.add_btree_table(Arc::new(sales_table)); + schema + .add_btree_table(Arc::new(sales_table)) + .expect("Test setup: failed to add sales table"); schema }}; diff --git a/core/incremental/view.rs b/core/incremental/view.rs index b95c8a0ca..957605d17 100644 --- a/core/incremental/view.rs +++ b/core/incremental/view.rs @@ -1565,10 +1565,22 @@ mod tests { unique_sets: vec![], }; - schema.add_btree_table(Arc::new(customers_table)); - schema.add_btree_table(Arc::new(orders_table)); - schema.add_btree_table(Arc::new(products_table)); - schema.add_btree_table(Arc::new(logs_table)); + schema + .add_btree_table(Arc::new(customers_table)) + .expect("Test setup: failed to add customers table"); + + schema + .add_btree_table(Arc::new(orders_table)) + .expect("Test setup: failed to add orders table"); + + schema + .add_btree_table(Arc::new(products_table)) + .expect("Test setup: failed to add products table"); + + schema + .add_btree_table(Arc::new(logs_table)) + .expect("Test setup: failed to add logs table"); + schema } diff --git a/core/schema.rs b/core/schema.rs index a0227a171..40cbb2d84 100644 --- a/core/schema.rs +++ b/core/schema.rs @@ -1116,26 +1116,27 @@ impl Schema { fn check_object_name_conflict(&self, name: &str) -> Result<()> { let normalized_name = normalize_ident(name); + if self.tables.contains_key(&normalized_name) { - return Err(crate::LimboError::ParseError(format!( - "table \"{}\" already exists", - name - ))); + return Err(crate::LimboError::ParseError( + ["table \"", name, "\" already exists"].concat().to_string(), + )); } + if self.views.contains_key(&normalized_name) { - return Err(crate::LimboError::ParseError(format!( - "view \"{}\" already exists", - name - ))); + return Err(crate::LimboError::ParseError( + ["view \"", name, "\" already exists"].concat().to_string(), + )); } + for index_list in self.indexes.values() { if index_list.iter().any(|i| i.name.eq_ignore_ascii_case(name)) { - return Err(crate::LimboError::ParseError(format!( - "index \"{}\" already exists", - name - ))); + return Err(crate::LimboError::ParseError( + ["index \"", name, "\" already exists"].concat().to_string(), + )); } } + Ok(()) } } diff --git a/core/translate/logical.rs b/core/translate/logical.rs index 6564e2ba3..bdd29972e 100644 --- a/core/translate/logical.rs +++ b/core/translate/logical.rs @@ -2445,7 +2445,9 @@ mod tests { has_autoincrement: false, unique_sets: vec![], }; - schema.add_btree_table(Arc::new(users_table)); + schema + .add_btree_table(Arc::new(users_table)) + .expect("Test setup: failed to add users table"); // Create orders table let orders_table = BTreeTable { @@ -2508,7 +2510,9 @@ mod tests { unique_sets: vec![], foreign_keys: vec![], }; - schema.add_btree_table(Arc::new(orders_table)); + schema + .add_btree_table(Arc::new(orders_table)) + .expect("Test setup: failed to add orders table"); // Create products table let products_table = BTreeTable { @@ -2571,7 +2575,9 @@ mod tests { unique_sets: vec![], foreign_keys: vec![], }; - schema.add_btree_table(Arc::new(products_table)); + schema + .add_btree_table(Arc::new(products_table)) + .expect("Test setup: failed to add products table"); schema } diff --git a/testing/create_table.test b/testing/create_table.test index 289e0e98f..e17196c9f 100755 --- a/testing/create_table.test +++ b/testing/create_table.test @@ -66,3 +66,38 @@ do_execsql_test_in_memory_any_error create_table_duplicate_column_names_case_ins do_execsql_test_in_memory_any_error create_table_duplicate_column_names_quoted { CREATE TABLE t("a", a); } + +# https://github.com/tursodatabase/turso/issues/3675 +do_execsql_test_in_memory_any_error create_table_view_collision-1 { + CREATE VIEW v_same AS SELECT 1; + CREATE TABLE v_same(x INT); +} + +do_execsql_test_in_memory_any_error create_view_table_collision-1 { + CREATE TABLE t_same(x INT); + CREATE VIEW t_same AS SELECT 1; +} + +do_execsql_test_in_memory_any_error create_index_view_collision-1 { + CREATE VIEW i_same AS SELECT 1; + CREATE TABLE t1(x); + CREATE INDEX i_same ON t1(x); +} + +do_execsql_test_in_memory_any_error create_index_table_collision-1 { + CREATE TABLE i_same(x INT); + CREATE TABLE t2(y); + CREATE INDEX i_same ON t2(y); +} + +do_execsql_test_in_memory_any_error create_table_index_collision-1 { + CREATE TABLE t3(z); + CREATE INDEX ix_same ON t3(z); + CREATE TABLE ix_same(x INT); +} + +do_execsql_test_in_memory_any_error create_view_index_collision-1 { + CREATE TABLE t4(w); + CREATE INDEX ix_same ON t4(w); + CREATE VIEW ix_same AS SELECT 1; +}