uqa_sql/schema/columns/
publication.rs1use crate::ast::{ColumnDef, ColumnType, Expr, GeneratedColumn};
9
10pub enum ColumnProperty<'a> {
11 Default(Option<Expr>),
12 Generated(Option<GeneratedColumn>),
13 Type(&'a ColumnType),
14 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}