From b444975aa8ec4f787d54f94fb13b7602fba0c517 Mon Sep 17 00:00:00 2001
From: Arseniy Volynets <vol0ncar@yandex.ru>
Date: Thu, 22 Feb 2024 19:46:33 +0300
Subject: [PATCH] feat: support rename procedure frontend

---
 sbroad-core/src/frontend/sql.rs         | 43 +++++++++++++++++++++++++
 sbroad-core/src/frontend/sql/query.pest |  6 +++-
 sbroad-core/src/ir/ddl.rs               |  9 +++++-
 3 files changed, 56 insertions(+), 2 deletions(-)

diff --git a/sbroad-core/src/frontend/sql.rs b/sbroad-core/src/frontend/sql.rs
index 992e3e6597..1ee5505326 100644
--- a/sbroad-core/src/frontend/sql.rs
+++ b/sbroad-core/src/frontend/sql.rs
@@ -189,6 +189,44 @@ fn parse_call_proc<M: Metadata>(
     Ok(call_proc)
 }
 
+fn parse_rename_proc(ast: &AbstractSyntaxTree, node: &ParseNode) -> Result<Ddl, SbroadError> {
+    if node.rule != Rule::RenameProc {
+        return Err(SbroadError::Invalid(
+            Entity::Type,
+            Some("rename procedure".into()),
+        ));
+    }
+
+    let mut old_name: String = String::new();
+    let mut new_name: String = String::new();
+    let mut params: Option<Vec<ParamDef>> = None;
+    let mut timeout = get_default_timeout();
+    for child_id in &node.children {
+        let child_node = ast.nodes.get_node(*child_id)?;
+        match child_node.rule {
+            Rule::NewProc => {
+                new_name = normalize_name_for_space_api(parse_string_value_node(ast, *child_id)?);
+            }
+            Rule::OldProc => {
+                old_name = normalize_name_for_space_api(parse_string_value_node(ast, *child_id)?);
+            }
+            Rule::ProcParams => {
+                params = Some(parse_proc_params(ast, child_node)?);
+            }
+            Rule::Timeout => {
+                timeout = get_timeout(ast, *child_id)?;
+            }
+            _ => panic!("Unexpected node: {child_node:?}"),
+        }
+    }
+    Ok(Ddl::RenameRoutine {
+        old_name,
+        new_name,
+        params,
+        timeout,
+    })
+}
+
 fn parse_create_proc(ast: &AbstractSyntaxTree, node: &ParseNode) -> Result<Ddl, SbroadError> {
     let proc_name_id = node.children.first().expect("Expected to get Proc name");
     let proc_name = parse_identifier(ast, *proc_name_id)?;
@@ -2455,6 +2493,11 @@ impl AbstractSyntaxTree {
                     let plan_id = plan.nodes.push(Node::Ddl(drop_proc));
                     map.add(id, plan_id);
                 }
+                Rule::RenameProc => {
+                    let rename_proc = parse_rename_proc(self, node)?;
+                    let plan_id = plan.nodes.push(Node::Ddl(rename_proc));
+                    map.add(id, plan_id);
+                }
                 Rule::AlterUser => {
                     let user_name_node_id = node
                         .children
diff --git a/sbroad-core/src/frontend/sql/query.pest b/sbroad-core/src/frontend/sql/query.pest
index d92d58b08f..33cd277485 100644
--- a/sbroad-core/src/frontend/sql/query.pest
+++ b/sbroad-core/src/frontend/sql/query.pest
@@ -50,7 +50,7 @@ ACL = _{ DropRole | DropUser | CreateRole | CreateUser | AlterUser | GrantPrivil
             PrivilegeUsage = { ^"usage" }
             PrivilegeWrite = { ^"write" }
 
-DDL = _{ CreateTable | DropTable | CreateProc | DropProc }
+DDL = _{ CreateTable | DropTable | CreateProc | DropProc | RenameProc }
     CreateTable = {
         ^"create" ~ ^"table" ~ NewTable ~
         "(" ~ Columns ~ "," ~ PrimaryKey ~ ")" ~
@@ -86,6 +86,10 @@ DDL = _{ CreateTable | DropTable | CreateProc | DropProc }
     DropProc = { ^"drop" ~ ^"procedure" ~ ProcWithOptionalParams ~ TimeoutOption? }
         ProcWithOptionalParams = { Identifier ~ ProcParams? }
 
+    RenameProc = { ^"alter" ~ ^"procedure" ~ OldProc ~ ProcParams? ~ ^"rename" ~ ^"to" ~ NewProc ~ TimeoutOption? }
+        OldProc = @{ Identifier }
+        NewProc = @{ Identifier }
+
 Block = { CallProc ~ DqlOption? }
     CallProc = { ^"call" ~ Identifier ~ "(" ~ ProcValues ~ ")" }
         ProcValues = { ProcValue? ~ ("," ~ ProcValue)* }
diff --git a/sbroad-core/src/ir/ddl.rs b/sbroad-core/src/ir/ddl.rs
index 18081fd16f..c16d76378c 100644
--- a/sbroad-core/src/ir/ddl.rs
+++ b/sbroad-core/src/ir/ddl.rs
@@ -62,6 +62,12 @@ pub enum Ddl {
         params: Vec<ParamDef>,
         timeout: Decimal,
     },
+    RenameRoutine {
+        old_name: String,
+        new_name: String,
+        params: Option<Vec<ParamDef>>,
+        timeout: Decimal,
+    },
 }
 
 impl Ddl {
@@ -74,7 +80,8 @@ impl Ddl {
             Ddl::CreateTable { ref timeout, .. }
             | Ddl::DropTable { ref timeout, .. }
             | Ddl::CreateProc { ref timeout, .. }
-            | Ddl::DropProc { ref timeout, .. } => timeout,
+            | Ddl::DropProc { ref timeout, .. }
+            | Ddl::RenameRoutine { ref timeout, .. } => timeout,
         }
         .to_string()
         .parse()
-- 
GitLab