mirror of
https://github.com/aljazceru/turso.git
synced 2025-12-18 17:14:20 +01:00
handle insert with column names
This commit is contained in:
@@ -112,14 +112,32 @@ pub fn translate_insert(
|
|||||||
}
|
}
|
||||||
let mut param_idx = 1;
|
let mut param_idx = 1;
|
||||||
for expr in values_expr.iter_mut().flat_map(|v| v.iter_mut()) {
|
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 {
|
if let Expr::Id(name) = expr {
|
||||||
|
println!("Expression was ID");
|
||||||
if name.is_double_quoted() {
|
if name.is_double_quoted() {
|
||||||
*expr = Expr::Literal(ast::Literal::String(format!("{name}")));
|
*expr = Expr::Literal(ast::Literal::String(format!("{name}")));
|
||||||
} else {
|
} else {
|
||||||
// an INSERT INTO ... VALUES (...) cannot reference columns
|
// an INSERT INTO ... VALUES (...) cannot reference columns
|
||||||
crate::bail_parse_error!("no such column: {name}");
|
crate::bail_parse_error!("no such column: {name}");
|
||||||
}
|
}
|
||||||
}
|
} else {}
|
||||||
|
*/
|
||||||
rewrite_expr(expr, &mut param_idx)?;
|
rewrite_expr(expr, &mut param_idx)?;
|
||||||
}
|
}
|
||||||
values = values_expr.pop();
|
values = values_expr.pop();
|
||||||
|
|||||||
@@ -769,6 +769,27 @@ fn test_read_wal_dumb_no_frames() -> anyhow::Result<()> {
|
|||||||
Ok(())
|
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<()> {
|
pub fn run_query(tmp_db: &TempDatabase, conn: &Arc<Connection>, query: &str) -> anyhow::Result<()> {
|
||||||
run_query_core(tmp_db, conn, query, None::<fn(&Row)>)
|
run_query_core(tmp_db, conn, query, None::<fn(&Row)>)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user