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:?}"),
}
}
#[test]
fn name_compare_length_cast() {
let mut e = Engine::new();
assert_eq!(
row_of(
&mut e,
"SELECT 'b'::name < 'a'::name, 'a'::name < 'b'::name, length('abc'::name), \
('abc'::name)::text, ('abc'::text)::name"
),
vec!["false", "true", "3", "abc", "abc"]
);
assert_eq!(
row_of(
&mut e,
"SELECT length(('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJ')::name)"
),
vec!["63"]
);
}
#[test]
fn name_orders_by_byte_value() {
let mut e = Engine::new();
match e
.execute(
"SELECT c FROM (VALUES ('m'::name), ('a'::name), ('z'::name), ('A'::name)) v(c) \
ORDER BY c",
)
.unwrap()
{
QueryResult::Rows { rows, .. } => {
let got: Vec<String> = rows
.iter()
.map(|r| spg_engine::eval::value_to_text(&r.values[0]))
.collect();
assert_eq!(got, vec!["A", "a", "m", "z"]);
}
other => panic!("order: {other:?}"),
}
}
#[test]
fn convert_transcodes_encodings() {
let mut e = Engine::new();
assert_eq!(
row_of(
&mut e,
"SELECT convert('abc', 'UTF8', 'UTF8'), \
convert('café', 'UTF8', 'LATIN1'), \
convert(convert('café', 'UTF8', 'LATIN1'), 'LATIN1', 'UTF8')"
),
vec!["\\x616263", "\\x636166e9", "\\x636166c3a9"]
);
}