use spg_engine::{Engine, EngineError, QueryResult};
fn rows(e: &mut Engine, sql: &str) -> usize {
match e.execute(sql).unwrap() {
QueryResult::Rows { rows, .. } => rows.len(),
_ => panic!("expected rows"),
}
}
#[test]
fn error_in_transaction_aborts_block_and_discards_work() {
let mut e = Engine::new();
e.execute("CREATE TABLE t(id int)").unwrap();
e.execute("BEGIN").unwrap();
e.execute("INSERT INTO t VALUES (1)").unwrap();
assert!(e.execute("SELECT 1 / 0").is_err());
assert!(matches!(
e.execute("SELECT 42"),
Err(EngineError::InFailedTransaction)
));
assert!(matches!(
e.execute("INSERT INTO t VALUES (2)"),
Err(EngineError::InFailedTransaction)
));
e.execute("ROLLBACK").unwrap();
assert_eq!(rows(&mut e, "SELECT 42"), 1);
assert_eq!(rows(&mut e, "SELECT * FROM t"), 0);
}
#[test]
fn commit_in_aborted_tx_rolls_back() {
let mut e = Engine::new();
e.execute("CREATE TABLE t(id int)").unwrap();
e.execute("BEGIN").unwrap();
e.execute("INSERT INTO t VALUES (3)").unwrap();
assert!(e.execute("SELECT 1 / 0").is_err());
e.execute("COMMIT").unwrap();
assert_eq!(rows(&mut e, "SELECT * FROM t"), 0);
}
#[test]
fn autocommit_error_does_not_abort() {
let mut e = Engine::new();
assert!(e.execute("SELECT 1 / 0").is_err());
assert_eq!(rows(&mut e, "SELECT 42"), 1);
}