Skip to main content

uqa_sql/ast/
domains.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! Domain declarations retain type identity and constraints until catalog binding.
8
9use serde::{Deserialize, Serialize};
10
11use super::{ColumnType, ConstraintCatalogIdentity, Expr};
12
13#[derive(Debug, Clone, Serialize, Deserialize)]
14pub struct CreateDomain {
15    pub name: String,
16    pub base: ColumnType,
17    pub collation: Option<String>,
18    #[serde(default, skip_serializing_if = "Option::is_none")]
19    pub collation_oid: Option<u32>,
20    pub default: Option<Expr>,
21    pub not_null: Option<DomainNotNull>,
22    pub checks: Vec<DomainCheck>,
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize)]
26pub struct DomainNotNull {
27    pub name: Option<String>,
28    #[serde(default)]
29    pub catalog_identity: Option<ConstraintCatalogIdentity>,
30}
31
32#[derive(Debug, Clone, Serialize, Deserialize)]
33pub struct DomainCheck {
34    pub name: Option<String>,
35    #[serde(default)]
36    pub catalog_identity: Option<ConstraintCatalogIdentity>,
37    pub expression: Expr,
38    #[serde(default = "super::default_true")]
39    pub validated: bool,
40}
41
42#[derive(Debug, Clone, Serialize, Deserialize)]
43pub struct AlterDomain {
44    pub name: String,
45    pub action: AlterDomainAction,
46}
47
48#[derive(Debug, Clone, Serialize, Deserialize)]
49pub enum AlterDomainAction {
50    AddCheck {
51        constraint: Box<DomainCheck>,
52    },
53    AddNotNull {
54        constraint: DomainNotNull,
55    },
56    DropConstraint {
57        name: String,
58        if_exists: bool,
59        cascade: bool,
60    },
61    ValidateConstraint {
62        name: String,
63    },
64}