Skip to content
Snippets Groups Projects
Commit c8035788 authored by Maksim Kaitmazian's avatar Maksim Kaitmazian Committed by Arseniy Volynets
Browse files

feat: implement SQL support for grant procedure

parent b8b8189d
No related branches found
No related tags found
1 merge request!1414sbroad import
...@@ -13,6 +13,8 @@ privilege ::= (('CREATE' | 'ALTER' | 'DROP') 'USER') ...@@ -13,6 +13,8 @@ privilege ::= (('CREATE' | 'ALTER' | 'DROP') 'USER')
| ('DROP' 'ON' 'ROLE' (role | user)) | ('DROP' 'ON' 'ROLE' (role | user))
| (('READ' | 'WRITE' | 'CREATE' | 'ALTER' | 'DROP') 'TABLE') | (('READ' | 'WRITE' | 'CREATE' | 'ALTER' | 'DROP') 'TABLE')
| (('ALTER' | 'DROP' | 'READ' | 'WRITE') 'ON' 'TABLE'? table) | (('ALTER' | 'DROP' | 'READ' | 'WRITE') 'ON' 'TABLE'? table)
| (('CREATE' | 'EXECUTE') 'PROCEDURE')
| ('EXECUTE' 'PROCEDURE' procedure ('(' type (',' type)* ')')?)
| role | role
create_procedure ::= 'CREATE PROCEDURE' procedure '(' type (',' type)* ')' create_procedure ::= 'CREATE PROCEDURE' procedure '(' type (',' type)* ')'
('language' 'SQL')? (('as' '$$' body '$$') | ('begin' 'atomic' body 'end')) ('language' 'SQL')? (('as' '$$' body '$$') | ('begin' 'atomic' body 'end'))
......
...@@ -655,6 +655,15 @@ fn parse_grant_revoke( ...@@ -655,6 +655,15 @@ fn parse_grant_revoke(
let table_name = parse_identifier(ast, *table_node_id)?; let table_name = parse_identifier(ast, *table_node_id)?;
GrantRevokeType::specific_table(privilege, table_name)? GrantRevokeType::specific_table(privilege, table_name)?
} }
Rule::PrivBlockProcedure => GrantRevokeType::procedure(privilege)?,
Rule::PrivBlockSpecificProcedure => {
let proc_node_id = inner_privilege_block_node.children.first().expect(
"Expected to see Name as a first child of PrivBlockSpecificProcedure",
);
let proc_node = ast.nodes.get_node(*proc_node_id)?;
let (proc_name, proc_params) = parse_proc_with_optional_params(ast, proc_node)?;
GrantRevokeType::specific_procedure(privilege, proc_name, proc_params)?
}
_ => { _ => {
return Err(SbroadError::Invalid( return Err(SbroadError::Invalid(
Entity::ParseNode, Entity::ParseNode,
......
...@@ -30,7 +30,8 @@ ACL = _{ DropRole | DropUser | CreateRole | CreateUser | AlterUser | GrantPrivil ...@@ -30,7 +30,8 @@ ACL = _{ DropRole | DropUser | CreateRole | CreateUser | AlterUser | GrantPrivil
RevokePrivilege = { ^"revoke" ~ PrivBlock ~ ^"from" ~ Identifier ~ TimeoutOption? } RevokePrivilege = { ^"revoke" ~ PrivBlock ~ ^"from" ~ Identifier ~ TimeoutOption? }
PrivBlock = _{ PrivBlockPrivilege | PrivBlockRolePass } PrivBlock = _{ PrivBlockPrivilege | PrivBlockRolePass }
PrivBlockPrivilege = {Privilege ~ (PrivBlockUser | PrivBlockSpecificUser | PrivBlockRole PrivBlockPrivilege = {Privilege ~ (PrivBlockUser | PrivBlockSpecificUser | PrivBlockRole
| PrivBlockSpecificRole | PrivBlockTable | PrivBlockSpecificTable)} | PrivBlockSpecificRole | PrivBlockTable | PrivBlockSpecificTable
| PrivBlockProcedure | PrivBlockSpecificProcedure)}
PrivBlockUser = { ^"user" } PrivBlockUser = { ^"user" }
PrivBlockSpecificUser = { ^"on" ~ ^"user" ~ Identifier } PrivBlockSpecificUser = { ^"on" ~ ^"user" ~ Identifier }
PrivBlockRole = { ^"role" } PrivBlockRole = { ^"role" }
...@@ -38,6 +39,8 @@ ACL = _{ DropRole | DropUser | CreateRole | CreateUser | AlterUser | GrantPrivil ...@@ -38,6 +39,8 @@ ACL = _{ DropRole | DropUser | CreateRole | CreateUser | AlterUser | GrantPrivil
PrivBlockTable = { ^"table" } PrivBlockTable = { ^"table" }
PrivBlockSpecificTable = { ^"on" ~ ^"table" ~ Table } PrivBlockSpecificTable = { ^"on" ~ ^"table" ~ Table }
PrivBlockRolePass = { Identifier } PrivBlockRolePass = { Identifier }
PrivBlockProcedure = { ^"procedure" }
PrivBlockSpecificProcedure = { ^"on" ~ ^"procedure" ~ ProcWithOptionalParams }
Privilege = _{ PrivilegeRead | PrivilegeWrite | PrivilegeExecute | Privilege = _{ PrivilegeRead | PrivilegeWrite | PrivilegeExecute |
PrivilegeCreate | PrivilegeAlter | PrivilegeDrop | PrivilegeCreate | PrivilegeAlter | PrivilegeDrop |
PrivilegeSession | PrivilegeUsage } PrivilegeSession | PrivilegeUsage }
......
...@@ -2,6 +2,8 @@ use crate::ir::{Entity, Node, Plan, SbroadError}; ...@@ -2,6 +2,8 @@ use crate::ir::{Entity, Node, Plan, SbroadError};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use tarantool::decimal::Decimal; use tarantool::decimal::Decimal;
use super::ddl::ParamDef;
::tarantool::define_str_enum! { ::tarantool::define_str_enum! {
/// Revoked or granted privilege. /// Revoked or granted privilege.
pub enum Privilege { pub enum Privilege {
...@@ -43,6 +45,14 @@ pub enum GrantRevokeType { ...@@ -43,6 +45,14 @@ pub enum GrantRevokeType {
privilege: Privilege, privilege: Privilege,
table_name: String, table_name: String,
}, },
Procedure {
privilege: Privilege,
},
SpecificProcedure {
privilege: Privilege,
proc_name: String,
proc_params: Option<Vec<ParamDef>>,
},
RolePass { RolePass {
role_name: String, role_name: String,
}, },
...@@ -131,6 +141,31 @@ impl GrantRevokeType { ...@@ -131,6 +141,31 @@ impl GrantRevokeType {
}) })
} }
/// # Errors
/// - Unacceptable privilege for procedure was passed.
pub fn procedure(privilege: Privilege) -> Result<Self, SbroadError> {
check_privilege(
privilege,
&[Privilege::Create, Privilege::Drop, Privilege::Execute],
)?;
Ok(Self::Procedure { privilege })
}
/// # Errors
/// - Unacceptable privilege for specific procedure was passed.
pub fn specific_procedure(
privilege: Privilege,
proc_name: String,
proc_params: Option<Vec<ParamDef>>,
) -> Result<Self, SbroadError> {
check_privilege(privilege, &[Privilege::Drop, Privilege::Execute])?;
Ok(Self::SpecificProcedure {
privilege,
proc_name,
proc_params,
})
}
#[must_use] #[must_use]
pub fn role_pass(role_name: String) -> Self { pub fn role_pass(role_name: String) -> Self {
Self::RolePass { role_name } Self::RolePass { role_name }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment