From 32b44502126acfc0b6570e5cb20fd69d4310825d Mon Sep 17 00:00:00 2001 From: EmirVildanov <reddog201030@gmail.com> Date: Wed, 4 Sep 2024 10:36:31 +0300 Subject: [PATCH] feat: interpret asterisk as a list of references for ScanRelation nodes --- .../src/backend/sql/ir/tests/projection.rs | 12 ++++++---- sbroad-core/src/backend/sql/tree.rs | 22 +++++++++++++++++++ sbroad-core/src/executor/tests/bucket_id.rs | 4 ++-- sbroad-core/src/executor/tests/exec_plan.rs | 8 ++++++- 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/sbroad-core/src/backend/sql/ir/tests/projection.rs b/sbroad-core/src/backend/sql/ir/tests/projection.rs index aa56503d5..ff49a8403 100644 --- a/sbroad-core/src/backend/sql/ir/tests/projection.rs +++ b/sbroad-core/src/backend/sql/ir/tests/projection.rs @@ -47,8 +47,10 @@ fn projection2_latest() { WHERE "identification_number" = 1"#; let expected = PatternWithParams::new( format!( - "{} {} {}", - r#"SELECT *"#, + "{} {} {} {} {}", + r#"SELECT "hash_testing"."identification_number","#, + r#""hash_testing"."product_code","#, + r#""hash_testing"."product_units", "hash_testing"."sys_op""#, r#"FROM "hash_testing""#, r#"WHERE ("hash_testing"."identification_number") = (?)"# ), @@ -64,8 +66,10 @@ fn projection2_oldest() { WHERE "identification_number" = 1"#; let expected = PatternWithParams::new( format!( - "{} {} {}", - r#"SELECT *"#, + "{} {} {} {} {}", + r#"SELECT "hash_testing"."identification_number","#, + r#""hash_testing"."product_code","#, + r#""hash_testing"."product_units", "hash_testing"."sys_op""#, r#"FROM "hash_testing""#, r#"WHERE ("hash_testing"."identification_number") = (?)"# ), diff --git a/sbroad-core/src/backend/sql/tree.rs b/sbroad-core/src/backend/sql/tree.rs index 2cd8d34c3..1f3423335 100644 --- a/sbroad-core/src/backend/sql/tree.rs +++ b/sbroad-core/src/backend/sql/tree.rs @@ -1513,9 +1513,31 @@ impl<'p> SyntaxPlan<'p> { relation_name, asterisk_id, }), + parent, + targets, .. } = expr_node { + // If we reference ScanNode, we don't want to transform asterisks + // in order not to select "bucket_id". That's why we save them as a + // sequence of references. + if let Some(parent) = parent { + let ir_plan = self.plan.get_ir_plan(); + let targets = targets + .clone() + .expect("Reference with parent must have targets."); + let first_target = targets.first().expect("Targets must not be empry"); + let child_id = ir_plan + .get_relational_child(*parent, *first_target) + .expect("Rel child must exist"); + let target_rel_node = ir_plan + .get_relation_node(child_id) + .expect("target node must exist"); + if let Relational::ScanRelation { .. } = target_rel_node { + return non_reference_nodes(); + } + } + let mut need_comma = false; let asterisk_id = *asterisk_id; if let Some(last_handled_asterisk_id) = last_handled_asterisk_id { diff --git a/sbroad-core/src/executor/tests/bucket_id.rs b/sbroad-core/src/executor/tests/bucket_id.rs index 64f003f6d..f494efe31 100644 --- a/sbroad-core/src/executor/tests/bucket_id.rs +++ b/sbroad-core/src/executor/tests/bucket_id.rs @@ -24,7 +24,7 @@ fn bucket1_test() { expected.rows.push(vec![ LuaValue::String("Execute query on all buckets".to_string()), LuaValue::String(String::from(PatternWithParams::new( - r#"SELECT *, "t1"."bucket_id" FROM "t1""#.to_string(), + r#"SELECT "t1"."a", "t1"."b", "t1"."bucket_id" FROM "t1""#.to_string(), vec![], ))), ]); @@ -83,7 +83,7 @@ fn bucket3_test() { expected.rows.push(vec![ LuaValue::String("Execute query on all buckets".to_string()), LuaValue::String(String::from(PatternWithParams::new( - r#"SELECT *, "func" (?) as "col_1" FROM "t1""#.to_string(), + r#"SELECT "t1"."a", "t1"."b", "func" (?) as "col_1" FROM "t1""#.to_string(), vec![Value::from("111".to_string())], ))), ]); diff --git a/sbroad-core/src/executor/tests/exec_plan.rs b/sbroad-core/src/executor/tests/exec_plan.rs index b299551cf..eb19e96ea 100644 --- a/sbroad-core/src/executor/tests/exec_plan.rs +++ b/sbroad-core/src/executor/tests/exec_plan.rs @@ -749,7 +749,13 @@ fn global_table_scan() { assert_eq!( sql, - PatternWithParams::new(format!("{}", r#"SELECT * FROM "global_t""#,), vec![]) + PatternWithParams::new( + format!( + "{}", + r#"SELECT "global_t"."a", "global_t"."b" FROM "global_t""#, + ), + vec![] + ) ); } -- GitLab