use spg_engine::{Engine, QueryResult};
use spg_storage::Value;
fn rows(r: QueryResult) -> Vec<Vec<Value<'static>>> {
match r {
QueryResult::Rows { rows, .. } => rows.into_iter().map(|r| r.values).collect(),
_ => panic!("expected rows"),
}
}
#[test]
fn pg_proc_lists_now() {
let mut e = Engine::new();
let r = rows(
e.execute("SELECT proname FROM pg_catalog.pg_proc WHERE proname = 'now'")
.unwrap(),
);
assert!(!r.is_empty());
assert_eq!(r[0][0], Value::text("now"));
}
#[test]
fn pg_proc_count_aggregate_is_aggregate_kind() {
let mut e = Engine::new();
let r = rows(
e.execute("SELECT prokind FROM pg_catalog.pg_proc WHERE proname = 'count'")
.unwrap(),
);
assert!(!r.is_empty(), "expected at least one count() row");
for row in &r {
assert_eq!(row[0], Value::text("a"), "count's prokind must be 'a'");
}
}
#[test]
fn pg_proc_window_function_kind() {
let mut e = Engine::new();
let r = rows(
e.execute("SELECT prokind FROM pg_catalog.pg_proc WHERE proname = 'row_number'")
.unwrap(),
);
assert!(!r.is_empty());
assert_eq!(r[0][0], Value::text("w"));
}
#[test]
fn pg_proc_joins_with_pg_type_on_return() {
let mut e = Engine::new();
let r = rows(
e.execute(
"SELECT p.proname, t.typname \
FROM pg_catalog.pg_proc p \
JOIN pg_catalog.pg_type t ON p.prorettype = t.oid \
WHERE p.proname = 'length'",
)
.unwrap(),
);
assert!(!r.is_empty());
assert_eq!(r[0][0], Value::text("length"));
assert_eq!(r[0][1], Value::text("int4"));
}