1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
use super::*; use crate::extension::postgres::*; impl QueryBuilder for PostgresQueryBuilder { fn placeholder(&self) -> (&str, bool) { ("$", true) } fn prepare_returning( &self, returning: &Vec<SelectExpr>, sql: &mut SqlWriter, collector: &mut dyn FnMut(Value), ) { if !returning.is_empty() { write!(sql, " RETURNING ").unwrap(); returning.iter().fold(true, |first, expr| { if !first { write!(sql, ", ").unwrap() } self.prepare_select_expr(expr, sql, collector); false }); } } fn if_null_function(&self) -> &str { "COALESCE" } fn write_string_quoted(&self, string: &str, buffer: &mut String) { let escaped = escape_string(string); let string = if escaped.find('\\').is_some() { "E'".to_owned() + &escaped + "'" } else { "'".to_owned() + &escaped + "'" }; write!(buffer, "{}", string).unwrap() } fn prepare_bin_oper(&self, bin_oper: &BinOper, sql: &mut SqlWriter, collector: &mut dyn FnMut(Value)) { match bin_oper { BinOper::Matches => write!(sql, "{}", "@@").unwrap(), BinOper::Contains => write!(sql, "{}", "@>").unwrap(), BinOper::Contained => write!(sql, "{}", "<@").unwrap(), _ => self.prepare_bin_oper_common(bin_oper, sql, collector), } } fn prepare_function( &self, function: &Function, sql: &mut SqlWriter, collector: &mut dyn FnMut(Value), ) { match function { Function::PgFunction(function) => write!( sql, "{}", match function { PgFunction::ToTsquery => "TO_TSQUERY", PgFunction::ToTsvector => "TO_TSVECTOR", PgFunction::PhrasetoTsquery => "PHRASETO_TSQUERY", PgFunction::PlaintoTsquery => "PLAINTO_TSQUERY", PgFunction::WebsearchToTsquery => "WEBSEARCH_TO_TSQUERY", PgFunction::TsRank => "TS_RANK", PgFunction::TsRankCd => "TS_RANK_CD", } ) .unwrap(), _ => self.prepare_function_common(function, sql, collector), } } }