Skip to content

Commit 9b25ed3

Browse files
committed
perf(quaint): support postgres insert from selection
Signed-off-by: Alexey Orlenko's AI Agent <robot@aqrln.net>
1 parent 1171e96 commit 9b25ed3

1 file changed

Lines changed: 37 additions & 0 deletions

File tree

quaint/src/visitor/postgres.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,24 @@ impl<'a> Visitor<'a> for Postgres<'a> {
378378
}
379379
}
380380
}
381+
Expression {
382+
kind: ExpressionKind::Selection(selection),
383+
..
384+
} => {
385+
let columns = insert.columns.len();
386+
387+
self.write(" (")?;
388+
for (i, c) in insert.columns.into_iter().enumerate() {
389+
self.visit_column(c.name.into_owned().into())?;
390+
391+
if i < (columns - 1) {
392+
self.write(",")?;
393+
}
394+
}
395+
396+
self.write(") ")?;
397+
self.visit_sub_selection(selection)?;
398+
}
381399
expr => self.surround_with("(", ")", |ref mut s| s.visit_expression(expr))?,
382400
}
383401

@@ -897,6 +915,25 @@ mod tests {
897915
assert_eq!(expected.1, params);
898916
}
899917

918+
#[test]
919+
#[cfg(feature = "postgresql")]
920+
fn test_insert_from_selection() {
921+
let expected = expected_values(
922+
"INSERT INTO \"relations\" (\"parent_id\",\"child_id\") SELECT \"parent_id\", \"child_id\" FROM \"children\" WHERE \"child_id\" = $1 ON CONFLICT DO NOTHING RETURNING \"child_id\"",
923+
vec![10],
924+
);
925+
let selection = Select::from_table("children")
926+
.columns(vec!["parent_id", "child_id"])
927+
.so_that("child_id".equals(10));
928+
let query = Insert::expression_into("relations", vec!["parent_id", "child_id"], selection)
929+
.on_conflict(OnConflict::DoNothing)
930+
.returning(vec!["child_id"]);
931+
let (sql, params) = Postgres::build(query).unwrap();
932+
933+
assert_eq!(expected.0, sql);
934+
assert_eq!(expected.1, params);
935+
}
936+
900937
#[test]
901938
#[cfg(feature = "postgresql")]
902939
fn test_insert_on_conflict_update() {

0 commit comments

Comments
 (0)