use spg_engine::{Engine, QueryResult};
fn scalar(e: &mut Engine, sql: &str) -> String {
match e.execute(sql).unwrap() {
QueryResult::Rows { rows, .. } => spg_engine::eval::value_to_text(&rows[0].values[0]),
other => panic!("{sql} -> {other:?}"),
}
}
#[test]
fn round469_a_temp_sequence_shadows_a_permanent_one_and_leaves_it_alone() {
let mut e = Engine::new();
e.execute("CREATE SEQUENCE perm").unwrap();
assert_eq!(scalar(&mut e, "SELECT nextval('perm')"), "1");
e.execute("CREATE TEMPORARY SEQUENCE perm").unwrap();
assert_eq!(scalar(&mut e, "SELECT nextval('perm')"), "1");
e.execute("DROP SEQUENCE perm").unwrap();
assert_eq!(scalar(&mut e, "SELECT nextval('perm')"), "2");
}
#[test]
fn round469_a_temp_view_shadows_a_permanent_one() {
let mut e = Engine::new();
e.execute("CREATE TABLE base (id INT)").unwrap();
e.execute("INSERT INTO base VALUES (1),(2),(3)").unwrap();
e.execute("CREATE VIEW vw AS SELECT id FROM base WHERE id < 3")
.unwrap();
assert_eq!(scalar(&mut e, "SELECT count(*) FROM vw"), "2");
e.execute("CREATE TEMPORARY VIEW vw AS SELECT id FROM base")
.unwrap();
assert_eq!(scalar(&mut e, "SELECT count(*) FROM vw"), "3");
e.execute("DROP VIEW vw").unwrap();
assert_eq!(scalar(&mut e, "SELECT count(*) FROM vw"), "2");
assert_eq!(
scalar(&mut e, "SELECT count(*) FROM pg_views WHERE viewname='vw'"),
"1"
);
}
#[test]
fn round469_another_session_sees_neither() {
let mut e = Engine::new();
e.set_current_session(1);
e.execute("CREATE TABLE base (id INT)").unwrap();
e.execute("INSERT INTO base VALUES (1),(2)").unwrap();
e.execute("CREATE TEMPORARY SEQUENCE s1").unwrap();
e.execute("CREATE TEMPORARY VIEW v1 AS SELECT id FROM base")
.unwrap();
assert_eq!(
scalar(&mut e, "SELECT count(*) FROM pg_class WHERE relname='s1'"),
"1"
);
e.set_current_session(2);
assert_eq!(
scalar(&mut e, "SELECT count(*) FROM pg_class WHERE relname='s1'"),
"0",
"session 2 must not see session 1's temporary sequence"
);
assert_eq!(
scalar(&mut e, "SELECT count(*) FROM pg_views WHERE viewname='v1'"),
"0",
"session 2 must not see session 1's temporary view"
);
assert!(
e.execute("SELECT nextval('s1')").is_err(),
"session 2 must not be able to advance session 1's temporary sequence"
);
assert!(
e.execute("SELECT count(*) FROM v1").is_err(),
"session 2 must not be able to read session 1's temporary view"
);
}
#[test]
fn round469_they_die_with_the_session() {
let mut e = Engine::new();
e.set_current_session(1);
e.execute("CREATE TABLE base (id INT)").unwrap();
e.execute("CREATE TEMPORARY SEQUENCE s1").unwrap();
e.execute("CREATE TEMPORARY VIEW v1 AS SELECT id FROM base")
.unwrap();
e.end_session(1);
e.set_current_session(2);
assert_eq!(
scalar(
&mut e,
"SELECT count(*) FROM pg_class WHERE relname LIKE '%s1'"
),
"0"
);
assert_eq!(scalar(&mut e, "SELECT count(*) FROM pg_views"), "0");
}