uqa_sql/schema/namespaces/
creation.rs1use crate::catalog::roles::RoleReference;
9use crate::{
10 ast::SchemaAuthorization,
11 catalog::roles::{guards::RoleCatalogGuards, RoleReferenceNames},
12 SQLError,
13};
14pub struct SchemaCreationTarget {
15 pub name: String,
16 pub role_owner: RoleReference,
17}
18pub fn schema_creation_target(
19 names: &dyn RoleReferenceNames,
20 roles: &dyn RoleCatalogGuards,
21 current_user: &RoleReference,
22 name: Option<&str>,
23 authorization: Option<&SchemaAuthorization>,
24) -> Result<SchemaCreationTarget, SQLError> {
25 let role_owner = match authorization {
26 None | Some(SchemaAuthorization::CurrentUser) => current_user.clone(),
27 Some(SchemaAuthorization::SessionUser) => names.session_role(),
28 Some(SchemaAuthorization::Role(role)) => role.clone().into(),
29 };
30 let catalog = roles.role_definitions();
31 let owner = role_owner.bind(&catalog)?;
32 Ok(SchemaCreationTarget {
33 name: name.unwrap_or(&owner.name).to_string(),
34 role_owner: RoleReference::Bound(owner.into()),
35 })
36}
37pub fn validate_schema_creation_name(name: &str) -> Result<(), SQLError> {
38 if name.starts_with("pg_") {
39 return Err(SQLError::Routine {
40 sqlstate: "42939".into(),
41 message: format!(r#"unacceptable schema name "{name}""#),
42 });
43 }
44 Ok(())
45}
46
47#[cfg(test)]
48mod tests;