use spg_engine::{Engine, QueryResult};
fn first(e: &mut Engine, sql: &str) -> spg_storage::Value<'static> {
let r = e
.execute(sql)
.unwrap_or_else(|err| panic!("{sql}: {err:?}"));
let QueryResult::Rows { rows, .. } = r else {
panic!("expected Rows");
};
rows[0].values[0].clone()
}
#[test]
fn to_regclass_existence_check() {
let mut e = Engine::new();
e.execute("CREATE TABLE reg_t (id INT)").unwrap();
let v = first(&mut e, "SELECT to_regclass('reg_t')");
assert_eq!(spg_engine::eval::value_to_text(&v), "reg_t");
assert!(matches!(v, spg_storage::Value::RegClass(oid, _) if oid >= 16384));
let v2 = first(&mut e, "SELECT to_regclass('public.reg_t')");
assert_eq!(spg_engine::eval::value_to_text(&v2), "reg_t");
assert!(matches!(
first(&mut e, "SELECT to_regclass('no_such_table')"),
spg_storage::Value::Null
));
}
#[test]
fn to_regclass_resolves_views() {
let mut e = Engine::new();
e.execute("CREATE TABLE vt (id INT)").unwrap();
e.execute("CREATE VIEW v_vt AS SELECT id FROM vt").unwrap();
let v = first(&mut e, "SELECT to_regclass('v_vt')");
assert_eq!(spg_engine::eval::value_to_text(&v), "v_vt");
assert!(matches!(v, spg_storage::Value::RegClass(oid, _) if oid >= 32768));
}
#[test]
fn to_regtype_builtin_names() {
let mut e = Engine::new();
assert_eq!(
first(&mut e, "SELECT to_regtype('integer')"),
spg_storage::Value::text("integer")
);
assert_eq!(
first(&mut e, "SELECT to_regtype('character varying')"),
spg_storage::Value::text("character varying")
);
assert_eq!(
first(&mut e, "SELECT to_regtype('jsonb')"),
spg_storage::Value::text("jsonb")
);
assert!(matches!(
first(&mut e, "SELECT to_regtype('no_such_type')"),
spg_storage::Value::Null
));
}
#[test]
fn to_regnamespace_known_schemas() {
let mut e = Engine::new();
assert_eq!(
first(&mut e, "SELECT to_regnamespace('public')"),
spg_storage::Value::text("public")
);
assert_eq!(
first(&mut e, "SELECT to_regnamespace('pg_catalog')"),
spg_storage::Value::text("pg_catalog")
);
assert!(matches!(
first(&mut e, "SELECT to_regnamespace('nope')"),
spg_storage::Value::Null
));
}