use crate::paginated_query_as::internal::{get_postgres_type_casting, QueryDialect};
pub struct PostgresDialect;
impl QueryDialect for PostgresDialect {
fn quote_identifier(&self, ident: &str) -> String {
format!("\"{}\"", ident.replace('"', "\"\""))
}
fn placeholder(&self, position: usize) -> String {
format!("${}", position)
}
fn type_cast(&self, value: &str) -> String {
get_postgres_type_casting(value).to_string()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_quote_identifier() {
let dialect = PostgresDialect;
assert_eq!(dialect.quote_identifier("column_name"), "\"column_name\"");
assert_eq!(dialect.quote_identifier("table"), "\"table\"");
assert_eq!(dialect.quote_identifier("my column"), "\"my column\"");
assert_eq!(dialect.quote_identifier("user-name"), "\"user-name\"");
assert_eq!(dialect.quote_identifier("table.column"), "\"table.column\"");
assert_eq!(
dialect.quote_identifier("column\"name"),
"\"column\"\"name\""
);
assert_eq!(
dialect.quote_identifier("my\"table\"name"),
"\"my\"\"table\"\"name\""
);
assert_eq!(dialect.quote_identifier(""), "\"\"");
}
#[test]
fn test_placeholder() {
let dialect = PostgresDialect;
assert_eq!(dialect.placeholder(1), "$1");
assert_eq!(dialect.placeholder(2), "$2");
assert_eq!(dialect.placeholder(10), "$10");
assert_eq!(dialect.placeholder(100), "$100");
assert_eq!(dialect.placeholder(0), "$0");
}
#[test]
fn test_type_cast() {
let dialect = PostgresDialect;
assert_eq!(dialect.type_cast("42"), "::smallint");
assert_eq!(dialect.type_cast("2147483647"), "::integer");
assert_eq!(dialect.type_cast("9223372036854775807"), "::bigint");
assert_eq!(dialect.type_cast("3.14"), "::real");
assert_eq!(dialect.type_cast("true"), "::boolean");
assert_eq!(dialect.type_cast("false"), "::boolean");
assert_eq!(dialect.type_cast("2024-01-01"), "::date");
assert_eq!(dialect.type_cast("{}"), "::jsonb");
assert_eq!(dialect.type_cast("[]"), "::jsonb");
assert_eq!(
dialect.type_cast("550e8400-e29b-41d4-a716-446655440000"),
"::uuid"
);
assert_eq!(dialect.type_cast("192.168.1.1"), "::inet");
assert_eq!(dialect.type_cast("NULL"), "");
assert_eq!(dialect.type_cast("invalid"), "");
}
}