From 6296134eb552be578e8bb67b3db0fbe728319410 Mon Sep 17 00:00:00 2001
From: EmirVildanov <reddog201030@gmail.com>
Date: Fri, 15 Mar 2024 13:05:02 +0300
Subject: [PATCH] feat: add support of user renaming

---
 doc/sql/query.ebnf                      |  2 +-
 sbroad-core/src/frontend/sql.rs         | 10 ++++++++++
 sbroad-core/src/frontend/sql/query.pest |  3 ++-
 sbroad-core/src/ir/acl.rs               |  3 +++
 4 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/doc/sql/query.ebnf b/doc/sql/query.ebnf
index cd02b46b6f..309fef2cd2 100644
--- a/doc/sql/query.ebnf
+++ b/doc/sql/query.ebnf
@@ -22,7 +22,7 @@ body           ::= (insert | update | delete)
 create_role    ::= 'CREATE ROLE' role ('OPTION' '(' ('TIMEOUT' '=' double)')')?
 create_table   ::= 'CREATE TABLE' table '(' column (',' column)* ',' primary_key ')' ('USING' ('MEMTX' | 'VINYL'))? distribution ('OPTION' '(' ('TIMEOUT' '=' double)')')?
 create_user    ::= 'CREATE USER' user 'WITH'? 'PASSWORD' "'" password "'" ('USING' ('CHAP-SHA1' | 'LDAP' | 'MD5'))? ('OPTION' '(' ('TIMEOUT' '=' double)')')?
-alter_user     ::= 'ALTER USER' user 'WITH'? ('LOGIN' | 'NOLOGIN' | 'PASSWORD' "'" password "'" ('USING' ('CHAP-SHA1' | 'LDAP' | 'MD5'))?) ('OPTION' '(' ('TIMEOUT' '=' double)')')?
+alter_user     ::= 'ALTER USER' user 'WITH'? ('LOGIN' | 'NOLOGIN' | 'PASSWORD' "'" password "'" ('USING' ('CHAP-SHA1' | 'LDAP' | 'MD5'))? | 'RENAME TO' user) ('OPTION' '(' ('TIMEOUT' '=' double)')')?
 column         ::= name ('BOOL' | 'DECIMAL' | 'DOUBLE' | 'INT' | 'NUMBER' | 'SCALAR' | 'STRING' | 'TEXT' | 'UNSIGNED' | 'VARCHAR') (('NOT'?)  'NULL')?
 primary_key    ::= 'PRIMARY KEY' '(' name (',' name)* ')'
 distribution   ::= 'GLOBAL' | ('DISTRIBUTED BY' '(' name (',' name)*  ')')
diff --git a/sbroad-core/src/frontend/sql.rs b/sbroad-core/src/frontend/sql.rs
index e96d8c1ccb..771c0b1376 100644
--- a/sbroad-core/src/frontend/sql.rs
+++ b/sbroad-core/src/frontend/sql.rs
@@ -2567,6 +2567,16 @@ impl AbstractSyntaxTree {
                                 auth_method,
                             }
                         }
+                        Rule::AlterRename => {
+                            let identifier_node_id = alter_option_node
+                                .children
+                                .first()
+                                .expect("Expected to see an identifier node under AlterRename");
+                            let identifier = parse_identifier(self, *identifier_node_id)?;
+                            AlterOption::Rename {
+                                new_name: identifier,
+                            }
+                        }
                         _ => {
                             return Err(SbroadError::Invalid(
                                 Entity::ParseNode,
diff --git a/sbroad-core/src/frontend/sql/query.pest b/sbroad-core/src/frontend/sql/query.pest
index c394039a90..6ad8fb4555 100644
--- a/sbroad-core/src/frontend/sql/query.pest
+++ b/sbroad-core/src/frontend/sql/query.pest
@@ -15,10 +15,11 @@ ACL = _{ DropRole | DropUser | CreateRole | CreateUser | AlterUser | GrantPrivil
     AlterUser = {
         ^"alter" ~ ^"user" ~ Identifier ~ (^"with")? ~ AlterOption ~ TimeoutOption?
     }
-        AlterOption = _{ AlterLogin | AlterNoLogin | AlterPassword }
+        AlterOption = _{ AlterLogin | AlterNoLogin | AlterPassword | AlterRename }
             AlterLogin = { ^"login" }
             AlterNoLogin = { ^"nologin" }
             AlterPassword = { ^"password" ~ SingleQuotedString ~ AuthMethod? }
+            AlterRename = { ^"rename" ~ ^"to" ~ Identifier }
 	AuthMethod = { ^"using" ~ (ChapSha1 | Md5 | Ldap) }
             ChapSha1 = { ^"chap-sha1" }
             Md5 = { ^"md5" }
diff --git a/sbroad-core/src/ir/acl.rs b/sbroad-core/src/ir/acl.rs
index 1bfb77377e..4d3d73e3e3 100644
--- a/sbroad-core/src/ir/acl.rs
+++ b/sbroad-core/src/ir/acl.rs
@@ -181,6 +181,9 @@ pub enum AlterOption {
         password: String,
         auth_method: String,
     },
+    Rename {
+        new_name: String,
+    },
 }
 
 #[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
-- 
GitLab