handle insert with column names

This commit is contained in:
Wallys Ferreira
2025-08-13 23:25:09 +00:00
parent a0f70f04f2
commit dbc4acf29a
2 changed files with 40 additions and 1 deletions

View File

@@ -112,14 +112,32 @@ pub fn translate_insert(
}
let mut param_idx = 1;
for expr in values_expr.iter_mut().flat_map(|v| v.iter_mut()) {
match expr {
Expr::Id(name) => {
if name.is_double_quoted() {
*expr = Expr::Literal(ast::Literal::String(format!("{name}")));
} else {
// an INSERT INTO ... VALUES (...) cannot reference columns
crate::bail_parse_error!("no such column: {name}");
}
}
Expr::Qualified(first_name, second_name) => {
// an INSERT INTO ... VALUES (...) cannot reference columns
crate::bail_parse_error!("no such column: {first_name}.{second_name}");
}
_ => {}
}
/*
if let Expr::Id(name) = expr {
println!("Expression was ID");
if name.is_double_quoted() {
*expr = Expr::Literal(ast::Literal::String(format!("{name}")));
} else {
// an INSERT INTO ... VALUES (...) cannot reference columns
crate::bail_parse_error!("no such column: {name}");
}
}
} else {}
*/
rewrite_expr(expr, &mut param_idx)?;
}
values = values_expr.pop();

View File

@@ -769,6 +769,27 @@ fn test_read_wal_dumb_no_frames() -> anyhow::Result<()> {
Ok(())
}
#[test]
fn test_insert_with_column_names() -> anyhow::Result<()> {
let tmp_db = TempDatabase::new_with_rusqlite("CREATE TABLE a(z)", false);
let conn = tmp_db.connect_limbo();
let result = conn.execute("INSERT INTO a VALUES (b.x)");
match result {
Ok(_) => panic!("Expected error but query succeeded."),
Err(error) => {
let error_msg = match error {
LimboError::ParseError(msg) => msg,
_ => panic!("Unexpected {error}"),
};
assert_eq!(error_msg, "no such column: b.x")
}
}
Ok(())
}
pub fn run_query(tmp_db: &TempDatabase, conn: &Arc<Connection>, query: &str) -> anyhow::Result<()> {
run_query_core(tmp_db, conn, query, None::<fn(&Row)>)
}