Skip to main content

pgevolve_core/ir/
mod.rs

1//! In-memory representation of a Postgres schema.
2//!
3//! The IR is the contract between every other component. Both the source-side
4//! parser and the catalog reader produce these types; the differ, dependency
5//! analyzer, and planner consume them.
6
7pub mod canon;
8pub mod catalog;
9pub mod cluster;
10pub mod collation;
11pub mod column;
12pub mod column_type;
13pub mod constraint;
14pub mod default_expr;
15pub mod default_privileges;
16pub mod difference;
17pub mod eq;
18pub mod extension;
19pub mod function;
20pub mod grant;
21pub mod index;
22pub mod partition;
23pub mod policy;
24pub mod publication;
25pub mod reloptions;
26pub mod schema;
27pub mod sequence;
28pub mod statistic;
29pub mod subscription;
30pub mod table;
31pub use function::*;
32pub mod procedure;
33pub use procedure::*;
34pub mod trigger;
35pub mod user_type;
36pub use user_type::*;
37pub mod view;
38pub use view::*;
39
40use thiserror::Error;
41
42/// Errors raised when constructing IR values.
43#[derive(Debug, Error)]
44pub enum IrError {
45    /// An identifier did not satisfy validation rules.
46    #[error("invalid identifier: {0}")]
47    InvalidIdentifier(String),
48
49    /// A type definition was not representable in our IR.
50    #[error("invalid column type: {0}")]
51    InvalidColumnType(String),
52
53    /// A required field was missing or empty.
54    #[error("missing required field: {0}")]
55    MissingField(&'static str),
56
57    /// A `PublicationScope::Selective` had no schemas and no tables.
58    #[error("publication {0:?}: empty Selective scope (no tables, no schemas)")]
59    EmptyPublication(crate::identifier::Identifier),
60    /// A `PublishedTable.columns` was `Some(vec![])`.
61    #[error("publication {0:?} table {1:?}: empty column list (use None to publish all columns)")]
62    EmptyColumnList(
63        crate::identifier::Identifier,
64        crate::identifier::QualifiedName,
65    ),
66    /// A `PublishKinds` had all four DML flags false.
67    #[error("publication {0:?}: empty publish bitset (must enable at least one DML kind)")]
68    EmptyPublishBitset(crate::identifier::Identifier),
69    /// A `PublishedTable.columns` contained a duplicate column name.
70    #[error("publication {0:?} table {1:?}: duplicate column {2:?} in column list")]
71    DuplicateColumnInPublication(
72        crate::identifier::Identifier,
73        crate::identifier::QualifiedName,
74        crate::identifier::Identifier,
75    ),
76
77    /// A `Subscription.publications` was empty.
78    #[error("subscription {0:?}: empty publication list (PG requires at least one)")]
79    EmptySubscriptionPublications(crate::identifier::Identifier),
80    /// A `Subscription.connection` was empty or whitespace-only.
81    #[error("subscription {0:?}: empty connection string")]
82    EmptyConnection(crate::identifier::Identifier),
83
84    /// A `StatisticKinds` had all three flags false.
85    #[error(
86        "statistic {0}: empty kinds bitset (must enable at least one of ndistinct, dependencies, mcv)"
87    )]
88    EmptyStatisticKinds(crate::identifier::QualifiedName),
89    /// A `Statistic.columns` was empty.
90    #[error("statistic {0}: empty column list")]
91    EmptyStatisticColumns(crate::identifier::QualifiedName),
92
93    /// A `Collation` failed canon validation (e.g. nondeterministic libc).
94    #[error("collation {qname}: invalid — {reason}")]
95    InvalidCollation {
96        /// Schema-qualified collation name.
97        qname: crate::identifier::QualifiedName,
98        /// Why the collation is invalid.
99        reason: String,
100    },
101}