keelson_psql/statement/
insert.rs1use keelson_core::clause::{
2 Conflict, HasConflict, HasReturning, HasTableRef, HasValues, HasWith, Returning, TableRef,
3 Values, With,
4};
5use keelson_core::expr::{Expr, IntoExpr, IntoExprList};
6use keelson_core::{Dialect, Error, Expression, Mod, Query, QueryExtensions, QueryType, SqlWriter};
7
8use crate::Psql;
9use crate::extras::Overriding;
10
11#[derive(Debug, Clone, Default)]
29pub struct InsertQuery {
30 pub with: With,
32 pub table: TableRef,
34 pub overriding: Option<Overriding>,
36 pub values: Values,
39 pub conflict: Conflict,
41 pub returning: Returning,
43}
44
45impl InsertQuery {
46 pub fn new() -> InsertQuery {
48 InsertQuery::default()
49 }
50
51 pub fn apply(&mut self, mods: impl Mod<InsertQuery>) {
53 mods.apply(self);
54 }
55}
56
57impl Expression for InsertQuery {
58 fn write_sql(&self, w: &mut SqlWriter<'_>) {
59 w.write_if(!self.with.is_empty(), "", &self.with, " ");
60
61 if self.table.is_empty() {
62 w.record_error(Error::Incomplete("the target table of an INSERT"));
65 return;
66 }
67 w.push_str("INSERT INTO ");
68 w.write_expr(&self.table);
69
70 if let Some(overriding) = &self.overriding {
71 w.push_str(" OVERRIDING ");
72 w.push_str(overriding.as_str());
73 w.push_str(" VALUE");
74 }
75
76 if self.values.is_empty() {
77 w.push_str(" DEFAULT VALUES");
78 } else {
79 w.push_str(" ");
80 w.write_expr(&self.values);
81 }
82
83 w.write_if(!self.conflict.is_empty(), " ", &self.conflict, "");
84 w.write_if(!self.returning.is_empty(), " ", &self.returning, "");
85 }
86}
87
88impl Query for InsertQuery {
89 fn query_type(&self) -> QueryType {
90 QueryType::Insert
91 }
92
93 fn dialect(&self) -> &dyn Dialect {
94 &Psql
95 }
96}
97
98impl<H, L, M> QueryExtensions<H, L, M> for InsertQuery {}
99
100impl IntoExpr for InsertQuery {
101 fn into_expr(self) -> Expr {
102 crate::query(self)
103 }
104}
105
106impl IntoExprList for InsertQuery {
107 fn into_expr_list(self) -> Vec<Expr> {
108 vec![self.into_expr()]
109 }
110}
111
112impl HasWith for InsertQuery {
113 fn with_mut(&mut self) -> &mut With {
114 &mut self.with
115 }
116}
117
118impl HasTableRef for InsertQuery {
119 fn table_ref_mut(&mut self) -> &mut TableRef {
120 &mut self.table
121 }
122}
123
124impl HasValues for InsertQuery {
125 fn values_mut(&mut self) -> &mut Values {
126 &mut self.values
127 }
128}
129
130impl HasConflict for InsertQuery {
131 fn conflict_mut(&mut self) -> &mut Conflict {
132 &mut self.conflict
133 }
134}
135
136impl HasReturning for InsertQuery {
137 fn returning_mut(&mut self) -> &mut Returning {
138 &mut self.returning
139 }
140}