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}
33
34impl OwnerObjectKind {
35    /// The SQL keyword(s) used in `ALTER <keyword> <name> OWNER TO <role>`.
36    #[must_use]
37    pub const fn sql_keyword(self) -> &'static str {
38        match self {
39            Self::Schema => "SCHEMA",
40            Self::Sequence => "SEQUENCE",
41            Self::Table => "TABLE",
42            Self::View => "VIEW",
43            Self::MaterializedView => "MATERIALIZED VIEW",
44            Self::Function => "FUNCTION",
45            Self::Procedure => "PROCEDURE",
46            Self::UserType => "TYPE",
47            Self::Publication => "PUBLICATION",
48            Self::Subscription => "SUBSCRIPTION",
49        }
50    }
51}
52
53/// An `ALTER <kind> <qname> OWNER TO <to>` statement, paired with the previous
54/// owner for audit / rollback purposes.
55#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
56pub struct AlterObjectOwner {
57    /// Which kind of object is being re-owned.
58    pub kind: OwnerObjectKind,
59    /// Qualified name of the object.
60    pub qname: QualifiedName,
61    /// Optional argument-signature suffix for routines (e.g., `(int, text)`).
62    /// Empty for non-routine kinds.
63    #[serde(default)]
64    pub signature: String,
65    /// Previous owner (taken from the target catalog; `__unknown_owner__` when
66    /// the catalog did not record an owner).
67    pub from: Identifier,
68    /// Desired new owner (taken from the source catalog).
69    pub to: Identifier,
70}
71
72#[cfg(test)]
73mod tests {
74    use super::*;
75
76    #[test]
77    fn sql_keywords_match_pg() {
78        assert_eq!(OwnerObjectKind::Schema.sql_keyword(), "SCHEMA");
79        assert_eq!(OwnerObjectKind::Sequence.sql_keyword(), "SEQUENCE");
80        assert_eq!(OwnerObjectKind::Table.sql_keyword(), "TABLE");
81        assert_eq!(OwnerObjectKind::View.sql_keyword(), "VIEW");
82        assert_eq!(
83            OwnerObjectKind::MaterializedView.sql_keyword(),
84            "MATERIALIZED VIEW"
85        );
86        assert_eq!(OwnerObjectKind::Function.sql_keyword(), "FUNCTION");
87        assert_eq!(OwnerObjectKind::Procedure.sql_keyword(), "PROCEDURE");
88        assert_eq!(OwnerObjectKind::UserType.sql_keyword(), "TYPE");
89        assert_eq!(OwnerObjectKind::Publication.sql_keyword(), "PUBLICATION");
90        assert_eq!(OwnerObjectKind::Subscription.sql_keyword(), "SUBSCRIPTION");
91    }
92}