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