multisql/executor/alter_row/
insert.rs1use {
2 super::{columns_to_positions, validate},
3 crate::{
4 data::Schema, types::ComplexTableName, ExecuteError, Glue, Payload, Result, Row, Value,
5 },
6 sqlparser::ast::{Ident, ObjectName, Query},
7};
8
9impl Glue {
10 pub async fn ast_insert(
11 &mut self,
12 table_name: &ObjectName,
13 columns: &[Ident],
14 source: &Query,
15 expect_data: bool,
16 ) -> Result<Payload> {
17 let ComplexTableName {
18 name: table_name,
19 database,
20 ..
21 } = &table_name.try_into()?;
22
23 let columns = columns
24 .iter()
25 .map(|column| column.value.as_str())
26 .collect::<Vec<_>>();
27 let (labels, rows) = self.ast_query(source.clone()).await?;
28 self.true_insert(
29 database,
30 table_name,
31 &columns,
32 rows,
33 Some(labels),
34 expect_data,
35 )
36 .await
37 }
38 pub async fn true_insert(
39 &mut self,
40 database: &Option<String>,
41 table: &str,
42 columns: &[&str],
43 mut rows: Vec<Vec<Value>>,
44 labels: Option<Vec<String>>,
45 expect_data: bool,
46 ) -> Result<Payload> {
47 let Schema {
48 column_defs,
49 indexes,
50 ..
51 } = self
52 .get_database(database)?
53 .fetch_schema(table)
54 .await?
55 .ok_or(ExecuteError::TableNotExists)?;
56 let column_positions = columns_to_positions(&column_defs, columns)?;
57
58 validate(&column_defs, &column_positions, &mut rows)?;
59 let mut rows: Vec<Row> = rows.into_iter().map(Row).collect();
60 #[cfg(feature = "auto-increment")]
61 self.auto_increment(database, table, &column_defs, &mut rows)
62 .await?;
63 self.validate_unique(database, table, &column_defs, &rows, None)
64 .await?;
65
66 let num_rows = rows.len();
67
68 let result = if expect_data {
69 Payload::Select {
70 labels: labels.unwrap_or_default(),
71 rows: rows.clone(),
72 }
73 } else {
74 Payload::Insert(num_rows)
75 };
76
77 self.insert_data(database, table, rows).await?;
78
79 if !indexes.is_empty() {
80 let database = &mut **self.get_mut_database(database)?;
81 for index in indexes.iter() {
82 index.reset(database, table, &column_defs).await?; }
85 }
86
87 Ok(result)
88 }
89 pub async fn insert_data(
90 &mut self,
91 database: &Option<String>,
92 table_name: &str,
93 rows: Vec<Row>,
94 ) -> Result<()> {
95 let database = &mut **self.get_mut_database(database)?;
96 database.insert_data(table_name, rows).await
97 }
98}