use oxibase::Database;
#[test]
fn test_sequence_lifecycle() {
let db = Database::open("memory://").unwrap();
db.execute(
"CREATE SEQUENCE my_seq START WITH 10 INCREMENT BY 5 MAXVALUE 25",
(),
)
.unwrap();
let val1: i64 = db.query_one("SELECT NEXTVAL('my_seq')", ()).unwrap();
assert_eq!(val1, 10);
let val2: i64 = db.query_one("SELECT NEXTVAL('my_seq')", ()).unwrap();
assert_eq!(val2, 15);
let val3: i64 = db.query_one("SELECT NEXTVAL('my_seq')", ()).unwrap();
assert_eq!(val3, 20);
let val4: i64 = db.query_one("SELECT NEXTVAL('my_seq')", ()).unwrap();
assert_eq!(val4, 25);
let err = db.query_one::<i64, _>("SELECT NEXTVAL('my_seq')", ());
assert!(
err.is_err(),
"Expected error when exceeding maxvalue without CYCLE"
);
let curr: i64 = db.query_one("SELECT CURRVAL('my_seq')", ()).unwrap();
assert_eq!(curr, 25);
let set: i64 = db.query_one("SELECT SETVAL('my_seq', 12)", ()).unwrap();
assert_eq!(set, 12);
let next_after_set: i64 = db.query_one("SELECT NEXTVAL('my_seq')", ()).unwrap();
assert_eq!(next_after_set, 17);
let mut rows = db.query("SELECT sequence_name, current_value FROM information_schema.sequences WHERE sequence_name = 'my_seq'", ()).unwrap();
let row = rows.next().unwrap().unwrap();
let name: String = row.get(0).unwrap();
let current_val: i64 = row.get(1).unwrap();
assert_eq!(name, "my_seq");
assert_eq!(current_val, 17);
db.execute(
"ALTER SEQUENCE my_seq RESTART WITH 100 INCREMENT BY 1 CYCLE",
(),
)
.unwrap();
let val5: i64 = db.query_one("SELECT NEXTVAL('my_seq')", ()).unwrap();
assert_eq!(val5, 100);
db.execute("DROP SEQUENCE my_seq", ()).unwrap();
let mut rows2 = db
.query(
"SELECT sequence_name FROM information_schema.sequences WHERE sequence_name = 'my_seq'",
(),
)
.unwrap();
assert!(rows2.next().is_none());
}