Skip to main content

uqa_sql/schema/
namespaces.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! Namespace declaration rules independent of catalog storage.
8
9pub mod removal;
10
11pub fn validate_schema_name(name: &str) -> Result<(), String> {
12    validate_stored_schema_name(name)?;
13    if crate::catalog::is_virtual_system_schema(name) {
14        return Err(format!("schema name `{name}` is reserved"));
15    }
16    Ok(())
17}
18
19/// Existing namespaces may persist owner and ACL overrides even when new declarations cannot use their names.
20pub fn validate_stored_schema_name(name: &str) -> Result<(), String> {
21    if name.is_empty() {
22        Err(format!("invalid schema name `{name}`"))
23    } else {
24        Ok(())
25    }
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31
32    #[test]
33    fn stored_system_namespace_security_is_valid_without_permitting_reserved_creation() {
34        for name in ["pg_catalog", "information_schema", "ag_catalog"] {
35            validate_stored_schema_name(name).unwrap();
36            assert!(validate_schema_name(name).unwrap_err().contains("reserved"));
37        }
38        for validate in [validate_schema_name, validate_stored_schema_name] {
39            assert!(validate("").unwrap_err().contains("invalid"));
40            validate("application").unwrap();
41        }
42    }
43}
44
45pub mod creation;