Skip to main content

pgevolve_core/diff/
owner_op.rs

1//! `AlterObjectOwner` — uniform owner-change op across grantable families.
2
3use serde::{Deserialize, Serialize};
4
5use crate::identifier::{Identifier, QualifiedName};
6
7/// Object kind discriminant for the renderer (`ALTER TABLE x OWNER TO`,
8/// `ALTER SCHEMA x OWNER TO`, etc.).
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
10#[serde(rename_all = "snake_case")]
11pub enum OwnerObjectKind {
12    /// `ALTER SCHEMA x OWNER TO`.
13    Schema,
14    /// `ALTER SEQUENCE x OWNER TO`.
15    Sequence,
16    /// `ALTER TABLE x OWNER TO`.
17    Table,
18    /// `ALTER VIEW x OWNER TO`.
19    View,
20    /// `ALTER MATERIALIZED VIEW x OWNER TO`.
21    MaterializedView,
22    /// `ALTER FUNCTION x() OWNER TO`.
23    Function,
24    /// `ALTER PROCEDURE x() OWNER TO`.
25    Procedure,
26    /// `ALTER TYPE x OWNER TO`.
27    UserType,
28    /// `ALTER PUBLICATION x OWNER TO`.
29    Publication,
30    /// `ALTER SUBSCRIPTION x OWNER TO`.
31    Subscription,
32    /// `ALTER STATISTICS x OWNER TO`.
33    Statistic,
34}
35
36impl OwnerObjectKind {
37    /// The SQL keyword(s) used in `ALTER <keyword> <name> OWNER TO <role>`.
38    #[must_use]
39    pub const fn sql_keyword(self) -> &'static str {
40        match self {
41            Self::Schema => "SCHEMA",
42            Self::Sequence => "SEQUENCE",
43            Self::Table => "TABLE",
44            Self::View => "VIEW",
45            Self::MaterializedView => "MATERIALIZED VIEW",
46            Self::Function => "FUNCTION",
47            Self::Procedure => "PROCEDURE",
48            Self::UserType => "TYPE",
49            Self::Publication => "PUBLICATION",
50            Self::Subscription => "SUBSCRIPTION",
51            Self::Statistic => "STATISTICS",
52        }
53    }
54}
55
56/// An `ALTER <kind> <qname> OWNER TO <to>` statement, paired with the previous
57/// owner for audit / rollback purposes.
58#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
59pub struct AlterObjectOwner {
60    /// Which kind of object is being re-owned.
61    pub kind: OwnerObjectKind,
62    /// Qualified name of the object.
63    pub qname: QualifiedName,
64    /// Optional argument-signature suffix for routines (e.g., `(int, text)`).
65    /// Empty for non-routine kinds.
66    #[serde(default)]
67    pub signature: String,
68    /// Previous owner (taken from the target catalog; `__unknown_owner__` when
69    /// the catalog did not record an owner).
70    pub from: Identifier,
71    /// Desired new owner (taken from the source catalog).
72    pub to: Identifier,
73}
74
75#[cfg(test)]
76mod tests {
77    use super::*;
78
79    #[test]
80    fn sql_keywords_match_pg() {
81        assert_eq!(OwnerObjectKind::Schema.sql_keyword(), "SCHEMA");
82        assert_eq!(OwnerObjectKind::Sequence.sql_keyword(), "SEQUENCE");
83        assert_eq!(OwnerObjectKind::Table.sql_keyword(), "TABLE");
84        assert_eq!(OwnerObjectKind::View.sql_keyword(), "VIEW");
85        assert_eq!(
86            OwnerObjectKind::MaterializedView.sql_keyword(),
87            "MATERIALIZED VIEW"
88        );
89        assert_eq!(OwnerObjectKind::Function.sql_keyword(), "FUNCTION");
90        assert_eq!(OwnerObjectKind::Procedure.sql_keyword(), "PROCEDURE");
91        assert_eq!(OwnerObjectKind::UserType.sql_keyword(), "TYPE");
92        assert_eq!(OwnerObjectKind::Publication.sql_keyword(), "PUBLICATION");
93        assert_eq!(OwnerObjectKind::Subscription.sql_keyword(), "SUBSCRIPTION");
94        assert_eq!(OwnerObjectKind::Statistic.sql_keyword(), "STATISTICS");
95    }
96}