mirror of
https://github.com/aljazceru/turso.git
synced 2025-12-18 09:04:19 +01:00
handle insert with column names
This commit is contained in:
@@ -112,7 +112,8 @@ pub fn translate_insert(
|
||||
}
|
||||
let mut param_idx = 1;
|
||||
for expr in values_expr.iter_mut().flat_map(|v| v.iter_mut()) {
|
||||
if let Expr::Id(name) = expr {
|
||||
match expr {
|
||||
Expr::Id(name) => {
|
||||
if name.is_double_quoted() {
|
||||
*expr = Expr::Literal(ast::Literal::String(format!("{name}")));
|
||||
} else {
|
||||
@@ -120,6 +121,23 @@ pub fn translate_insert(
|
||||
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();
|
||||
|
||||
@@ -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)>)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user