From ae7a1ba568b5a43dafff71989e8b4d9452f9989d Mon Sep 17 00:00:00 2001
From: Denis Smirnov <sd@picodata.io>
Date: Fri, 1 Apr 2022 13:52:35 +0700
Subject: [PATCH] fix: a bug with motion linker (wrong rebase)

---
 .../engine/cartridge/backend/sql/tree.rs      | 23 ++++---
 src/executor/tests.rs                         | 64 +++++++++++++++++--
 src/ir/transformation/equality_propagation.rs |  2 -
 3 files changed, 72 insertions(+), 17 deletions(-)

diff --git a/src/executor/engine/cartridge/backend/sql/tree.rs b/src/executor/engine/cartridge/backend/sql/tree.rs
index 81d438b8c4..9853022b48 100644
--- a/src/executor/engine/cartridge/backend/sql/tree.rs
+++ b/src/executor/engine/cartridge/backend/sql/tree.rs
@@ -525,17 +525,20 @@ impl<'p> SyntaxPlan<'p> {
                     if let Some(motion_id) = ir_plan.get_motion_from_row(id)? {
                         // Replace motion node to virtual table node
                         let vtable = self.plan.get_motion_vtable(motion_id)?;
-                        let sn = SyntaxNode::new_pointer(
-                            id,
-                            None,
-                            &[
-                                self.nodes.push_syntax_node(SyntaxNode::new_open()),
-                                self.nodes.push_syntax_node(SyntaxNode::new_vtable(vtable)),
-                                self.nodes.push_syntax_node(SyntaxNode::new_close()),
-                            ],
-                        );
+                        if vtable.get_alias().is_none() {
+                            println!("id {}, motion id {}, vtable {:?}", id, motion_id, vtable);
+                            let sn = SyntaxNode::new_pointer(
+                                id,
+                                None,
+                                &[
+                                    self.nodes.push_syntax_node(SyntaxNode::new_open()),
+                                    self.nodes.push_syntax_node(SyntaxNode::new_vtable(vtable)),
+                                    self.nodes.push_syntax_node(SyntaxNode::new_close()),
+                                ],
+                            );
 
-                        return Ok(self.nodes.push_syntax_node(sn));
+                            return Ok(self.nodes.push_syntax_node(sn));
+                        }
                     }
 
                     if let Some(sq_id) = ir_plan.get_sub_query_from_row_node(id)? {
diff --git a/src/executor/tests.rs b/src/executor/tests.rs
index d6fa699798..11615df387 100644
--- a/src/executor/tests.rs
+++ b/src/executor/tests.rs
@@ -96,8 +96,7 @@ fn linker_test() {
 
     let mut query = Query::new(engine, sql).unwrap();
     let motion_id = query.exec_plan.get_ir_plan().get_slices().unwrap()[0][0];
-    let mut virtual_table = virtual_table_23();
-    virtual_table.set_alias("test").unwrap();
+    let virtual_table = virtual_table_23();
     query
         .engine
         .add_virtual_table(motion_id, virtual_table)
@@ -150,8 +149,7 @@ fn union_linker_test() {
 
     let mut query = Query::new(engine, sql).unwrap();
     let motion_id = query.exec_plan.get_ir_plan().get_slices().unwrap()[0][0];
-    let mut virtual_table = virtual_table_23();
-    virtual_table.set_alias("\"t2\"").unwrap();
+    let virtual_table = virtual_table_23();
     query
         .engine
         .add_virtual_table(motion_id, virtual_table)
@@ -266,7 +264,7 @@ WHERE "t3"."id" = 2 AND "t8"."identification_number" = 2"#;
                     r#"INNER JOIN"#,
                     r#"(SELECT COLUMN_2 as "identification_number" FROM (VALUES (2),(3))"#,
                     r#") as "t8""#,
-                    r#"ON ("t3"."id") = (SELECT COLUMN_4 as "identification_number" FROM (VALUES (2),(3)))"#,
+                    r#"ON ("t3"."id") = ("t8"."identification_number")"#,
                     r#"WHERE ("t3"."id", "t8"."identification_number") = (2, 2)"#
                 )
             )
@@ -329,6 +327,62 @@ fn join_linker2_test() {
     assert_eq!(expected, result)
 }
 
+#[test]
+fn join_linker3_test() {
+    let sql = r#"SELECT "t2"."id1" FROM
+    (SELECT "id" FROM "test_space") AS "t1"
+    INNER JOIN
+    (SELECT "id" as "id1", "FIRST_NAME" FROM "test_space") AS "t2"
+    ON "t2"."id1" = 1"#;
+
+    let engine = EngineMock::new();
+
+    let mut query = Query::new(engine, sql).unwrap();
+    let motion_id = query.exec_plan.get_ir_plan().get_slices().unwrap()[0][0];
+
+    let mut virtual_table = VirtualTable::new();
+    virtual_table.add_column(Column {
+        name: "id1".into(),
+        r#type: Type::Integer,
+    });
+    virtual_table.add_column(Column {
+        name: "id2".into(),
+        r#type: Type::Integer,
+    });
+    virtual_table.add_values_tuple(vec![
+        IrValue::number_from_str("1").unwrap(),
+        IrValue::number_from_str("1").unwrap(),
+    ]);
+    virtual_table.add_values_tuple(vec![
+        IrValue::number_from_str("2").unwrap(),
+        IrValue::number_from_str("2").unwrap(),
+    ]);
+    virtual_table.set_alias("\"t2\"").unwrap();
+
+    query
+        .engine
+        .add_virtual_table(motion_id, virtual_table)
+        .unwrap();
+
+    let result = query.exec().unwrap();
+
+    let mut expected = BoxExecuteFormat::new();
+    let bucket1 = query.engine.determine_bucket_id("1");
+
+    expected.rows.extend(vec![vec![
+        Value::String(format!("Execute query on a bucket [{}]", bucket1)),
+        Value::String(format!(
+            "{} {} {} {} {}",
+            r#"SELECT "t2"."id1" as "id1" FROM"#,
+            r#"(SELECT "test_space"."id" as "id" FROM "test_space") as "t1""#,
+            r#"INNER JOIN"#,
+            r#"(SELECT COLUMN_3 as "id1",COLUMN_4 as "id2" FROM (VALUES (1,1),(2,2))) as "t2""#,
+            r#"ON ("t2"."id1") = (1)"#,
+        )),
+    ]]);
+    assert_eq!(expected, result)
+}
+
 // select * from "test_1" where "identification_number" in (select COLUMN_2 as "b" from (values (1), (2))) or "identification_number" in (select COLUMN_2 as "c" from (values (3), (4)));
 #[test]
 fn anonymous_col_index_test() {
diff --git a/src/ir/transformation/equality_propagation.rs b/src/ir/transformation/equality_propagation.rs
index 4836ca20e0..eddfee78a6 100644
--- a/src/ir/transformation/equality_propagation.rs
+++ b/src/ir/transformation/equality_propagation.rs
@@ -319,8 +319,6 @@ impl Nodes {
                     self.arena.get(*top).ok_or(QueryPlannerError::InvalidNode)?
                 {
                     tops.push(*top);
-                } else {
-                    return Err(QueryPlannerError::InvalidBool);
                 }
             }
         }
-- 
GitLab