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}
15pub fn column_mut<'a>(
16    columns: &'a mut [ColumnDef],
17    table: &str,
18    column: &str,
19) -> Result<&'a mut ColumnDef, String> {
20    columns
21        .iter_mut()
22        .find(|definition| definition.name == column)
23        .ok_or_else(|| format!("column `{column}` does not exist on table `{table}`"))
24}
25pub fn apply_property(
26    columns: &mut [ColumnDef],
27    table: &str,
28    column: &str,
29    property: ColumnProperty<'_>,
30) -> Result<(), String> {
31    let definition = column_mut(columns, table, column)?;
32    match property {
33        ColumnProperty::Default(default) => definition.default = default,
34        ColumnProperty::Generated(generated) => definition.generated = generated,
35        ColumnProperty::Type(ty) => definition.ty.clone_from(ty),
36    }
37    Ok(())
38}
39pub fn set_not_null(
40    columns: &mut [ColumnDef],
41    table: &str,
42    column: &str,
43    not_null: bool,
44) -> Result<(), String> {
45    let definition = column_mut(columns, table, column)?;
46    definition.not_null = not_null;
47    definition.not_null_explicit = not_null;
48    definition.not_null_is_local = true;
49    definition.not_null_validated = true;
50    definition.not_null_no_inherit = false;
51    if !not_null {
52        definition.not_null_name = None;
53    }
54    Ok(())
55}