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 event_trigger;
35pub mod trigger;
36pub mod user_type;
37pub use user_type::*;
38pub mod view;
39pub use view::*;
40
41use thiserror::Error;
42
43/// Errors raised when constructing IR values.
44#[derive(Debug, Error)]
45pub enum IrError {
46    /// An identifier did not satisfy validation rules.
47    #[error("invalid identifier: {0}")]
48    InvalidIdentifier(String),
49
50    /// A type definition was not representable in our IR.
51    #[error("invalid column type: {0}")]
52    InvalidColumnType(String),
53
54    /// A required field was missing or empty.
55    #[error("missing required field: {0}")]
56    MissingField(&'static str),
57
58    /// A `PublicationScope::Selective` had no schemas and no tables.
59    #[error("publication {0:?}: empty Selective scope (no tables, no schemas)")]
60    EmptyPublication(crate::identifier::Identifier),
61    /// A `PublishedTable.columns` was `Some(vec![])`.
62    #[error("publication {0:?} table {1:?}: empty column list (use None to publish all columns)")]
63    EmptyColumnList(
64        crate::identifier::Identifier,
65        crate::identifier::QualifiedName,
66    ),
67    /// A `PublishKinds` had all four DML flags false.
68    #[error("publication {0:?}: empty publish bitset (must enable at least one DML kind)")]
69    EmptyPublishBitset(crate::identifier::Identifier),
70    /// A `PublishedTable.columns` contained a duplicate column name.
71    #[error("publication {0:?} table {1:?}: duplicate column {2:?} in column list")]
72    DuplicateColumnInPublication(
73        crate::identifier::Identifier,
74        crate::identifier::QualifiedName,
75        crate::identifier::Identifier,
76    ),
77
78    /// A `Subscription.publications` was empty.
79    #[error("subscription {0:?}: empty publication list (PG requires at least one)")]
80    EmptySubscriptionPublications(crate::identifier::Identifier),
81    /// A `Subscription.connection` was empty or whitespace-only.
82    #[error("subscription {0:?}: empty connection string")]
83    EmptyConnection(crate::identifier::Identifier),
84
85    /// A `StatisticKinds` had all three flags false.
86    #[error(
87        "statistic {0}: empty kinds bitset (must enable at least one of ndistinct, dependencies, mcv)"
88    )]
89    EmptyStatisticKinds(crate::identifier::QualifiedName),
90    /// A `Statistic.columns` was empty.
91    #[error("statistic {0}: empty column list")]
92    EmptyStatisticColumns(crate::identifier::QualifiedName),
93
94    /// Two event triggers share a name.
95    #[error("duplicate event trigger: {0}")]
96    DuplicateEventTrigger(crate::identifier::Identifier),
97
98    /// Two tablespaces share a name.
99    #[error("duplicate tablespace: {0}")]
100    DuplicateTablespace(crate::identifier::Identifier),
101
102    /// A `Collation` failed canon validation (e.g. nondeterministic libc).
103    #[error("collation {qname}: invalid — {reason}")]
104    InvalidCollation {
105        /// Schema-qualified collation name.
106        qname: crate::identifier::QualifiedName,
107        /// Why the collation is invalid.
108        reason: String,
109    },
110}