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
75
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(),
BinOper::Concatenate => 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),
}
}
}