diff --git a/core/schema.rs b/core/schema.rs index fda6c12ba..32dc631c5 100644 --- a/core/schema.rs +++ b/core/schema.rs @@ -178,6 +178,7 @@ impl PseudoTable { ty, primary_key, is_rowid_alias: false, + default: None, }); } pub fn get_column(&self, name: &str) -> Option<(usize, &Column)> { @@ -268,22 +269,33 @@ fn create_table( } None => Type::Null, }; - let mut primary_key = col_def.constraints.iter().any(|c| { - matches!( - c.constraint, - sqlite3_parser::ast::ColumnConstraint::PrimaryKey { .. } - ) - }); + + let mut default = None; + let mut primary_key = false; + for c_def in &col_def.constraints { + match &c_def.constraint { + sqlite3_parser::ast::ColumnConstraint::PrimaryKey { .. } => { + primary_key = true; + } + sqlite3_parser::ast::ColumnConstraint::Default(expr) => { + default = Some(expr.clone()) + } + _ => {} + } + } + if primary_key { primary_key_column_names.push(name.clone()); } else if primary_key_column_names.contains(&name) { primary_key = true; } + cols.push(Column { name: normalize_ident(&name), ty, primary_key, is_rowid_alias: typename_exactly_integer && primary_key, + default, }); } if options.contains(TableOptions::WITHOUT_ROWID) { @@ -332,6 +344,7 @@ pub struct Column { pub ty: Type, pub primary_key: bool, pub is_rowid_alias: bool, + pub default: Option, } #[derive(Debug, Clone, Copy, PartialEq)] @@ -370,30 +383,35 @@ pub fn sqlite_schema_table() -> BTreeTable { ty: Type::Text, primary_key: false, is_rowid_alias: false, + default: None, }, Column { name: "name".to_string(), ty: Type::Text, primary_key: false, is_rowid_alias: false, + default: None, }, Column { name: "tbl_name".to_string(), ty: Type::Text, primary_key: false, is_rowid_alias: false, + default: None, }, Column { name: "rootpage".to_string(), ty: Type::Integer, primary_key: false, is_rowid_alias: false, + default: None, }, Column { name: "sql".to_string(), ty: Type::Text, primary_key: false, is_rowid_alias: false, + default: None, }, ], } @@ -711,6 +729,16 @@ mod tests { Ok(()) } + #[test] + pub fn test_default_value() -> Result<()> { + let sql = r#"CREATE TABLE t1 (a INTEGER DEFAULT 23);"#; + let table = BTreeTable::from_sql(sql, 0)?; + let column = table.get_column("a").unwrap().1; + let default = column.default.clone().unwrap(); + assert_eq!(default.to_string(), "23"); + Ok(()) + } + #[test] pub fn test_sqlite_schema() { let expected = r#"CREATE TABLE sqlite_schema ( @@ -785,6 +813,7 @@ mod tests { ty: Type::Integer, primary_key: false, is_rowid_alias: false, + default: None, }], }; diff --git a/core/translate/group_by.rs b/core/translate/group_by.rs index 1e52a98b5..4c593643c 100644 --- a/core/translate/group_by.rs +++ b/core/translate/group_by.rs @@ -171,6 +171,7 @@ pub fn emit_group_by<'a>( primary_key: false, ty: crate::schema::Type::Null, is_rowid_alias: false, + default: None, }) .collect::>(); diff --git a/core/translate/order_by.rs b/core/translate/order_by.rs index db6ada538..04e29035b 100644 --- a/core/translate/order_by.rs +++ b/core/translate/order_by.rs @@ -73,6 +73,7 @@ pub fn emit_order_by( primary_key: false, ty: crate::schema::Type::Null, is_rowid_alias: false, + default: None, }); } for (i, rc) in result_columns.iter().enumerate() { @@ -87,6 +88,7 @@ pub fn emit_order_by( primary_key: false, ty: crate::schema::Type::Null, is_rowid_alias: false, + default: None, }); } diff --git a/core/translate/plan.rs b/core/translate/plan.rs index 3c1fe54f0..e151ea9e4 100644 --- a/core/translate/plan.rs +++ b/core/translate/plan.rs @@ -275,6 +275,7 @@ impl TableReference { ty: Type::Text, // FIXME: infer proper type is_rowid_alias: false, primary_key: false, + default: None, }) .collect(), ))),