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