From e1ca1ec7933dd5e65b43bf06616585260e016f9e Mon Sep 17 00:00:00 2001 From: Denis Smirnov <sd@picodata.io> Date: Thu, 28 Dec 2023 18:15:00 +0700 Subject: [PATCH] fix: update column names --- sbroad-core/src/frontend/sql.rs | 5 ++- sbroad-core/src/frontend/sql/ir/tests.rs | 2 + .../src/frontend/sql/ir/tests/update.rs | 43 +++++++++++++++++++ sbroad-core/src/ir/api/parameter.rs | 1 + sbroad-core/src/ir/operator.rs | 1 + 5 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 sbroad-core/src/frontend/sql/ir/tests/update.rs diff --git a/sbroad-core/src/frontend/sql.rs b/sbroad-core/src/frontend/sql.rs index ff28308535..5a0e5ef941 100644 --- a/sbroad-core/src/frontend/sql.rs +++ b/sbroad-core/src/frontend/sql.rs @@ -1652,9 +1652,10 @@ impl Ast for AbstractSyntaxTree { )); } let col = self.nodes.get_node(*ast_column_id)?; - let col_name = parse_string_value_node(self, *ast_column_id)?; + let col_name = + normalize_name_from_sql(parse_string_value_node(self, *ast_column_id)?); if let Type::ColumnName = col.rule { - match names.get(col_name) { + match names.get(col_name.as_str()) { Some((&ColumnRole::User, pos)) => { if pk_positions.contains(pos) { return Err(SbroadError::Invalid( diff --git a/sbroad-core/src/frontend/sql/ir/tests.rs b/sbroad-core/src/frontend/sql/ir/tests.rs index ec4b1e4169..f025ea88a2 100644 --- a/sbroad-core/src/frontend/sql/ir/tests.rs +++ b/sbroad-core/src/frontend/sql/ir/tests.rs @@ -2816,3 +2816,5 @@ mod global; #[cfg(test)] mod params; mod single; +#[cfg(test)] +mod update; diff --git a/sbroad-core/src/frontend/sql/ir/tests/update.rs b/sbroad-core/src/frontend/sql/ir/tests/update.rs new file mode 100644 index 0000000000..c342101348 --- /dev/null +++ b/sbroad-core/src/frontend/sql/ir/tests/update.rs @@ -0,0 +1,43 @@ +use crate::ir::transformation::helpers::sql_to_optimized_ir; +use crate::ir::value::Value; +use pretty_assertions::assert_eq; + +#[test] +fn update1() { + let pattern = r#"UPDATE "test_space" SET first_name = 'test'"#; + let plan = sql_to_optimized_ir(pattern, vec![]); + + let expected_explain = String::from( + r#"update "test_space" +"FIRST_NAME" = COL_0 + motion [policy: local] + projection ('test'::string -> COL_0, "test_space"."id"::unsigned -> COL_1) + scan "test_space" +execution options: +sql_vdbe_max_steps = 45000 +vtable_max_rows = 5000 +"#, + ); + + assert_eq!(expected_explain, plan.as_explain().unwrap()); +} + +#[test] +fn update2() { + let pattern = r#"UPDATE "test_space" SET first_name = ?"#; + let plan = sql_to_optimized_ir(pattern, vec![Value::from("test")]); + + let expected_explain = String::from( + r#"update "test_space" +"FIRST_NAME" = COL_0 + motion [policy: local] + projection ('test'::string -> COL_0, "test_space"."id"::unsigned -> COL_1) + scan "test_space" +execution options: +sql_vdbe_max_steps = 45000 +vtable_max_rows = 5000 +"#, + ); + + assert_eq!(expected_explain, plan.as_explain().unwrap()); +} diff --git a/sbroad-core/src/ir/api/parameter.rs b/sbroad-core/src/ir/api/parameter.rs index 4d56bec13a..7dbe18b7e3 100644 --- a/sbroad-core/src/ir/api/parameter.rs +++ b/sbroad-core/src/ir/api/parameter.rs @@ -181,6 +181,7 @@ impl Plan { } } Expression::Reference { .. } => { + println!("expr: {expr:?}, id: {id}"); // Remember to recalculate type. new_types.insert(id, expr.recalculate_type(self)?); } diff --git a/sbroad-core/src/ir/operator.rs b/sbroad-core/src/ir/operator.rs index e87f775f64..98056533bb 100644 --- a/sbroad-core/src/ir/operator.rs +++ b/sbroad-core/src/ir/operator.rs @@ -1092,6 +1092,7 @@ impl Plan { strategy: update_kind, }; let update_id = self.nodes.push(Node::Relational(update_node)); + self.replace_parent_in_subtree(upd_output, None, Some(update_id))?; Ok(update_id) } -- GitLab