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