use spg_engine::{Engine, QueryResult};
fn row_of(e: &mut Engine, sql: &str) -> Vec<String> {
match e.execute(sql).unwrap() {
QueryResult::Rows { rows, .. } => rows[0]
.values
.iter()
.map(spg_engine::eval::value_to_text)
.collect(),
other => panic!("{sql}: {other:?}"),
}
}
fn col_of(e: &mut Engine, sql: &str) -> Vec<String> {
match e.execute(sql).unwrap() {
QueryResult::Rows { rows, .. } => rows
.iter()
.map(|r| spg_engine::eval::value_to_text(&r.values[0]))
.collect(),
other => panic!("{sql}: {other:?}"),
}
}
fn err_of(e: &mut Engine, sql: &str) -> String {
format!("{}", e.execute(sql).unwrap_err())
}
#[test]
fn interval_order_by_is_span_ordered() {
let mut e = Engine::new();
assert_eq!(
col_of(
&mut e,
"SELECT x FROM (VALUES (interval '4 hours'),(interval '1 hour'),\
(interval '2 hours')) t(x) ORDER BY x"
),
vec!["01:00:00", "02:00:00", "04:00:00"]
);
assert_eq!(
col_of(
&mut e,
"SELECT x FROM (VALUES (interval '1 month'),(interval '29 days'),\
(interval '31 days')) t(x) ORDER BY x"
),
vec!["29 days", "1 mon", "31 days"]
);
}
#[test]
fn percentile_fraction_contract() {
let mut e = Engine::new();
assert!(
err_of(
&mut e,
"SELECT percentile_cont(1.5) WITHIN GROUP (ORDER BY x) FROM (VALUES (1),(2)) t(x)"
)
.contains("percentile value 1.5 is not between 0 and 1")
);
assert!(
err_of(
&mut e,
"SELECT percentile_cont(-0.1) WITHIN GROUP (ORDER BY x) FROM (VALUES (1),(2)) t(x)"
)
.contains("percentile value -0.1 is not between 0 and 1")
);
assert_eq!(
row_of(
&mut e,
"SELECT percentile_cont(NULL::float8) WITHIN GROUP (ORDER BY x) \
FROM (VALUES (1),(2)) t(x)"
),
vec!["NULL"]
);
assert_eq!(
row_of(
&mut e,
"SELECT percentile_disc(ARRAY[NULL,0.5]::float8[]) WITHIN GROUP (ORDER BY x) \
FROM (VALUES (1),(2)) t(x)"
),
vec!["{NULL,1}"]
);
}
#[test]
fn percentile_cont_interval_overload() {
let mut e = Engine::new();
assert_eq!(
row_of(
&mut e,
"SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY x) FROM \
(VALUES (interval '1 hour'),(interval '2 hours'),(interval '4 hours')) t(x)"
),
vec!["02:00:00"]
);
assert_eq!(
row_of(
&mut e,
"SELECT percentile_cont(0.25) WITHIN GROUP (ORDER BY x) FROM \
(VALUES (interval '1 day'),(interval '3 days')) t(x)"
),
vec!["1 day 12:00:00"]
);
}
#[test]
fn hypothetical_set_multi_key() {
let mut e = Engine::new();
assert_eq!(
row_of(
&mut e,
"SELECT rank(5, 'x') WITHIN GROUP (ORDER BY a, b) FROM \
(VALUES (1,'a'),(5,'w'),(5,'y')) t(a,b)"
),
vec!["3"]
);
assert!(
err_of(
&mut e,
"SELECT rank(2, 3) WITHIN GROUP (ORDER BY a) FROM (VALUES (1)) t(a)"
)
.contains("function rank(integer, integer, integer) does not exist")
);
}