diesel/query_builder/insert_statement/
insert_from_select.rs
1use crate::expression::{Expression, NonAggregate, SelectableExpression};
2use crate::insertable::*;
3use crate::query_builder::*;
4use crate::query_source::Table;
5
6#[derive(Debug, Clone, Copy, QueryId)]
8pub struct InsertFromSelect<Select, Columns> {
9 pub(in crate::query_builder) query: Select,
10 pub(in crate::query_builder) columns: Columns,
11}
12
13impl<Select, Columns> InsertFromSelect<Select, Columns> {
14 pub fn new<T>(query: Select) -> Self
17 where
18 T: Table<AllColumns = Columns>,
19 Columns: SelectableExpression<T> + NonAggregate,
20 {
21 Self {
22 query,
23 columns: T::all_columns(),
24 }
25 }
26
27 pub fn with_columns<C>(self, columns: C) -> InsertFromSelect<Select, C> {
29 InsertFromSelect {
30 query: self.query,
31 columns,
32 }
33 }
34}
35
36impl<DB, Select, Columns> CanInsertInSingleQuery<DB> for InsertFromSelect<Select, Columns>
37where
38 DB: Backend,
39{
40 fn rows_to_insert(&self) -> Option<usize> {
41 None
42 }
43}
44
45impl<DB, Select, Columns> QueryFragment<DB> for InsertFromSelect<Select, Columns>
46where
47 DB: Backend,
48 Columns: ColumnList + Expression,
49 Select: Query<SqlType = Columns::SqlType> + QueryFragment<DB>,
50{
51 fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, DB>) -> QueryResult<()> {
52 out.push_sql("(");
53 self.columns.walk_ast(out.reborrow())?;
54 out.push_sql(") ");
55 self.query.walk_ast(out.reborrow())?;
56 Ok(())
57 }
58}
59
60impl<Select, Columns> UndecoratedInsertRecord<Columns::Table> for InsertFromSelect<Select, Columns>
61where
62 Columns: ColumnList + Expression,
63 Select: Query<SqlType = Columns::SqlType>,
64{
65}