use vibesql_ast::{Assignment, BinaryOperator, Expression, UpdateStmt, WhereClause};
use vibesql_catalog::{ColumnSchema, TableSchema};
use vibesql_executor::UpdateExecutor;
use vibesql_storage::{Database, Row};
use vibesql_types::{DataType, SqlValue};
#[test]
fn test_update_with_default_value() {
let mut db = Database::new();
let mut name_column =
ColumnSchema::new("name".to_string(), DataType::Varchar { max_length: Some(50) }, false);
name_column.default_value =
Some(Expression::Literal(SqlValue::Varchar(arcstr::ArcStr::from("Unknown"))));
let schema = TableSchema::new(
"users".to_string(),
vec![ColumnSchema::new("id".to_string(), DataType::Integer, false), name_column],
);
db.create_table(schema).unwrap();
db.insert_row(
"users",
Row::new(vec![SqlValue::Integer(1), SqlValue::Varchar(arcstr::ArcStr::from("Alice"))]),
)
.unwrap();
let stmt = UpdateStmt {
with_clause: None,
from_clause: None,
quoted: false,
alias: None,
table_name: "users".to_string(),
assignments: vec![Assignment { column: "name".to_string(), value: Expression::Default }],
where_clause: Some(WhereClause::Condition(Expression::BinaryOp {
op: BinaryOperator::Equal,
left: Box::new(Expression::ColumnRef(vibesql_ast::ColumnIdentifier::simple(
"id", false,
))),
right: Box::new(Expression::Literal(SqlValue::Integer(1))),
})),
conflict_clause: None,
returning: None,
};
let count = UpdateExecutor::execute(&stmt, &mut db).unwrap();
assert_eq!(count, 1);
let table = db.get_table("users").unwrap();
let row = &table.scan()[0];
assert_eq!(row.get(1), Some(&SqlValue::Varchar(arcstr::ArcStr::from("Unknown"))));
}
#[test]
fn test_update_default_no_default_value_defined() {
let mut db = Database::new();
let schema = TableSchema::new(
"users".to_string(),
vec![
ColumnSchema::new("id".to_string(), DataType::Integer, false),
ColumnSchema::new(
"name".to_string(),
DataType::Varchar { max_length: Some(50) },
true, ),
],
);
db.create_table(schema).unwrap();
db.insert_row(
"users",
Row::new(vec![SqlValue::Integer(1), SqlValue::Varchar(arcstr::ArcStr::from("Alice"))]),
)
.unwrap();
let stmt = UpdateStmt {
with_clause: None,
from_clause: None,
quoted: false,
alias: None,
table_name: "users".to_string(),
assignments: vec![Assignment { column: "name".to_string(), value: Expression::Default }],
where_clause: Some(WhereClause::Condition(Expression::BinaryOp {
op: BinaryOperator::Equal,
left: Box::new(Expression::ColumnRef(vibesql_ast::ColumnIdentifier::simple(
"id", false,
))),
right: Box::new(Expression::Literal(SqlValue::Integer(1))),
})),
conflict_clause: None,
returning: None,
};
let count = UpdateExecutor::execute(&stmt, &mut db).unwrap();
assert_eq!(count, 1);
let table = db.get_table("users").unwrap();
let row = &table.scan()[0];
assert_eq!(row.get(1), Some(&SqlValue::Null));
}