diff --git a/src/ir/transformation/redistribution/tests.rs b/src/ir/transformation/redistribution/tests.rs index 66baac5c96d46f69050a2e3a671cf8ba7601c225..71212a21e1a6ef1bc0b3869222955213e4d130b5 100644 --- a/src/ir/transformation/redistribution/tests.rs +++ b/src/ir/transformation/redistribution/tests.rs @@ -185,3 +185,49 @@ fn full_motion_non_segment_outer_for_sub_query() { let expected_plan = Plan::from_yaml(&s).unwrap(); assert_eq!(plan, expected_plan); } + +#[test] +fn local_sub_query() { + // t1(a int) key [a] + // t2(a int, b int) key [a] + // select * from t1 where a = (select a from t2) + let mut plan = Plan::new(); + let mut children: Vec<usize> = Vec::new(); + + let t1 = Table::new_seg("t1", vec![Column::new("a", Type::Integer)], &["a"]).unwrap(); + plan.add_rel(t1); + let scan_t1_id = plan.add_scan("t1").unwrap(); + children.push(scan_t1_id); + + let t2 = Table::new_seg("t2", vec![Column::new("a", Type::Integer)], &["a"]).unwrap(); + plan.add_rel(t2); + let scan_t2_id = plan.add_scan("t2").unwrap(); + let proj_id = plan.add_proj(scan_t2_id, &["a"]).unwrap(); + let sq_id = plan.add_sub_query(proj_id, None).unwrap(); + children.push(sq_id); + + let id = plan.nodes.next_id(); + let inner_a_id = plan + .add_row_from_sub_query(id, &children[..], children.len() - 1, &["a"]) + .unwrap(); + let outer_a_id = plan.add_row_from_child(id, scan_t1_id, &["a"]).unwrap(); + let eq_id = plan.add_bool(outer_a_id, Bool::Eq, inner_a_id).unwrap(); + + let select_id = plan.add_select(&children[..], eq_id, id).unwrap(); + plan.set_top(select_id).unwrap(); + + plan.add_motions().unwrap(); + + // Check the modified plan + plan.nodes.add_new_equalities().unwrap(); + let path = Path::new("") + .join("tests") + .join("artifactory") + .join("ir") + .join("transformation") + .join("redistribution") + .join("local_sub_query.yaml"); + let s = fs::read_to_string(path).unwrap(); + let expected_plan = Plan::from_yaml(&s).unwrap(); + assert_eq!(plan, expected_plan); +} diff --git a/tests/artifactory/ir/transformation/redistribution/local_sub_query.yaml b/tests/artifactory/ir/transformation/redistribution/local_sub_query.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e29653776032c704b7ce90291e6fa71b2868c766 --- /dev/null +++ b/tests/artifactory/ir/transformation/redistribution/local_sub_query.yaml @@ -0,0 +1,183 @@ +--- +nodes: + arena: + - Expression: + Reference: + targets: ~ + position: 0 + parent: 0 + - Expression: + Alias: + name: a + child: 0 + - Expression: + Row: + list: + - 1 + distribution: + Segment: + keys: + - positions: + - 0 + - Relational: + ScanRelation: + output: 2 + id: 0 + relation: t1 + - Expression: + Reference: + targets: ~ + position: 0 + parent: 4 + - Expression: + Alias: + name: a + child: 4 + - Expression: + Row: + list: + - 5 + distribution: + Segment: + keys: + - positions: + - 0 + - Relational: + ScanRelation: + output: 6 + id: 4 + relation: t2 + - Expression: + Reference: + targets: + - 0 + position: 0 + parent: 8 + - Expression: + Alias: + name: a + child: 8 + - Expression: + Row: + list: + - 9 + distribution: + Segment: + keys: + - positions: + - 0 + - Relational: + Projection: + children: + - 7 + id: 8 + output: 10 + - Expression: + Reference: + targets: + - 0 + position: 0 + parent: 12 + - Expression: + Alias: + name: a + child: 12 + - Expression: + Row: + list: + - 13 + distribution: + Segment: + keys: + - positions: + - 0 + - Relational: + ScanSubQuery: + alias: ~ + children: + - 11 + id: 12 + output: 14 + - Expression: + Reference: + targets: + - 1 + position: 0 + parent: 16 + - Expression: + Row: + list: + - 16 + distribution: + Segment: + keys: + - positions: + - 0 + - Expression: + Reference: + targets: + - 0 + position: 0 + parent: 16 + - Expression: + Row: + list: + - 18 + distribution: + Segment: + keys: + - positions: + - 0 + - Expression: + Bool: + left: 19 + op: Eq + right: 17 + - Expression: + Reference: + targets: + - 0 + position: 0 + parent: 16 + - Expression: + Alias: + name: a + child: 21 + - Expression: + Row: + list: + - 22 + distribution: + Segment: + keys: + - positions: + - 0 + - Relational: + Selection: + children: + - 3 + - 15 + filter: 20 + id: 16 + output: 23 +relations: + t1: + Segment: + columns: + - name: a + type: integer + key: + positions: + - 0 + name: t1 + t2: + Segment: + columns: + - name: a + type: integer + key: + positions: + - 0 + name: t2 +slices: ~ +top: 24