Skip to main content

uqa_sql/schema/columns/
publication.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! Mutate a declared column candidate before its catalog publication.
8use crate::ast::{ColumnDef, ColumnType, Expr, GeneratedColumn};
9
10pub enum ColumnProperty<'a> {
11    Default(Option<Expr>),
12    Generated(Option<GeneratedColumn>),
13    Type(&'a ColumnType),
14    /// The `SERIAL` or identity provenance of the column.
15    AutoIncrement(Option<crate::ast::AutoIncrement>),
16}
17pub fn column_mut<'a>(
18    columns: &'a mut [ColumnDef],
19    table: &str,
20    column: &str,
21) -> Result<&'a mut ColumnDef, String> {
22    columns
23        .iter_mut()
24        .find(|definition| definition.name == column)
25        .ok_or_else(|| format!("column `{column}` does not exist on table `{table}`"))
26}
27pub fn apply_property(
28    columns: &mut [ColumnDef],
29    table: &str,
30    column: &str,
31    property: ColumnProperty<'_>,
32) -> Result<(), String> {
33    let definition = column_mut(columns, table, column)?;
34    match property {
35        ColumnProperty::Default(default) => definition.default = default,
36        ColumnProperty::Generated(generated) => definition.generated = generated,
37        ColumnProperty::Type(ty) => definition.ty.clone_from(ty),
38        ColumnProperty::AutoIncrement(provenance) => definition.auto_increment = provenance,
39    }
40    Ok(())
41}
42pub fn set_not_null(
43    columns: &mut [ColumnDef],
44    table: &str,
45    column: &str,
46    not_null: bool,
47) -> Result<(), String> {
48    let definition = column_mut(columns, table, column)?;
49    definition.not_null = not_null;
50    definition.not_null_explicit = not_null;
51    definition.not_null_is_local = true;
52    definition.not_null_validated = true;
53    definition.not_null_no_inherit = false;
54    if !not_null {
55        definition.not_null_name = None;
56        definition.not_null_identity = None;
57    }
58    Ok(())
59}