use pgx::prelude::*;
#[pg_extern(immutable)]
fn returns_tuple_with_attributes(
) -> TableIterator<'static, (name!(arg, String), name!(arg2, String))> {
TableIterator::once(("hi".to_string(), "bye".to_string()))
}
#[pg_extern]
fn fdw_handler_return() -> pgx::PgBox<pgx::pg_sys::FdwRoutine> {
unimplemented!("Not a functional test, just a signature test for SQL generation. Feel free to make a functional test!")
}
#[cfg(any(test, feature = "pg_test"))]
#[pgx::pg_schema]
mod tests {
#[allow(unused_imports)]
use crate as pgx_tests;
use pgx::prelude::*;
#[pg_extern]
fn returns_named_tuple_with_rust_reserved_keyword<'a>(
) -> TableIterator<'a, (name!(type, String), name!(i, i32))> {
unimplemented!()
}
#[pg_extern(immutable)]
fn is_immutable() {}
#[pg_test]
fn test_immutable() {
let result = Spi::get_one::<bool>(
"SELECT provolatile = 'i' FROM pg_proc WHERE proname = 'is_immutable'",
);
assert_eq!(result, Ok(Some(true)));
}
#[pg_extern(sql = r#"
CREATE FUNCTION tests."overridden_sql_with_fn_name"() RETURNS boolean
STRICT
LANGUAGE c /* Rust */
AS '@MODULE_PATHNAME@', '@FUNCTION_NAME@';
"#)]
fn overridden_sql_with_fn_name() -> bool {
true
}
#[pg_test]
fn test_overridden_sql_with_fn_name() {
let result = Spi::get_one::<bool>(r#"SELECT tests."overridden_sql_with_fn_name"()"#);
assert_eq!(result, Ok(Some(true)));
}
#[pg_extern(sql = r#"
CREATE FUNCTION tests."create_or_replace_method"() RETURNS bool
STRICT
LANGUAGE c /* Rust */
AS '@MODULE_PATHNAME@', '@FUNCTION_NAME@';
"#)]
fn create_or_replace_method_first() -> bool {
false
}
#[pg_extern(create_or_replace, requires = [create_or_replace_method_first])]
fn create_or_replace_method() -> bool {
true
}
#[pg_extern(create_or_replace)]
fn create_or_replace_method_other() -> i32 {
42
}
#[pg_test]
fn test_create_or_replace() {
let replace_result = Spi::get_one::<bool>(r#"SELECT tests."create_or_replace_method"()"#);
assert_eq!(replace_result, Ok(Some(true)));
let create_result =
Spi::get_one::<i32>(r#"SELECT tests."create_or_replace_method_other"()"#);
assert_eq!(create_result, Ok(Some(42)));
}
#[pg_extern]
fn anyele_type(x: pgx::AnyElement) -> pg_sys::Oid {
x.oid()
}
#[pg_test]
fn test_anyele_type() {
let interval_type =
Spi::get_one::<pg_sys::Oid>(r#"SELECT tests."anyele_type"('5 hours'::interval)"#);
assert_eq!(interval_type, Ok(Some(pg_sys::INTERVALOID)));
}
#[pg_extern(name = "custom_name")]
fn fn_custom() -> bool {
true
}
#[pg_test]
fn test_name() {
let result = Spi::get_one::<bool>(r#"SELECT tests."custom_name"()"#);
assert_eq!(result, Ok(Some(true)));
}
}