diff --git a/sbroad-core/src/frontend/sql.rs b/sbroad-core/src/frontend/sql.rs index ff28308535d5e41578f477f1d241a0925e6fc6d1..5a0e5ef941ad4e0922e9c8953b01be1a5b3872c9 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 ec4b1e41690289629dacfd7cc9e081d64899a9e6..f025ea88a2611511fd94f90dac2088f93f29d447 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 0000000000000000000000000000000000000000..c3421013484999c8f981ea5c54215e95e9c62b35 --- /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 4d56bec13ac0631c8a9028649068f5856f58cf3a..7dbe18b7e34f342a926b0f3e3744d57458f98c22 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 e87f775f641d725baba355702801351c3891c99b..98056533bb46a18859750fb81f43fdc497ae021a 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) }