Skip to content

Commit 0d804df

Browse files
committed
sql-parser: update statement ast
1 parent 27907cc commit 0d804df

File tree

6 files changed

+152
-101
lines changed

6 files changed

+152
-101
lines changed

src/ast/select.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ pub struct Select {
2222
pub columns: Vec<SelectItem>,
2323

2424
/// The FROM clause
25-
pub from: Option<SelectFrom>,
25+
pub from: Option<FromClause>,
2626

2727
/// The WHERE clause
2828
pub where_clause: Option<Box<Expression>>,
@@ -67,7 +67,7 @@ pub enum SelectItem {
6767
/// An AST for representing a FROM clause in the
6868
/// [SELECT](https://www.sqlite.org/lang_select.html) statement
6969
#[derive(Debug, PartialEq, Clone)]
70-
pub enum SelectFrom {
70+
pub enum FromClause {
7171
/// Select from a table
7272
Table(QualifiedTableName),
7373

@@ -78,7 +78,7 @@ pub enum SelectFrom {
7878
Subquery(SelectFromSubquery),
7979

8080
/// Select from cartesian product of tables
81-
Froms(Vec<SelectFrom>),
81+
Froms(Vec<FromClause>),
8282

8383
/// Select from a JOIN clause
8484
Join(JoinClause),
@@ -134,7 +134,7 @@ pub struct SelectFromSubquery {
134134
/// A clause for a JOIN statement
135135
#[derive(Debug, PartialEq, Clone)]
136136
pub struct JoinClause {
137-
pub lhs_table: Box<SelectFrom>,
137+
pub lhs_table: Box<FromClause>,
138138

139139
pub join_tables: Vec<JoinTable>,
140140
}
@@ -143,7 +143,7 @@ pub struct JoinClause {
143143
#[derive(Debug, PartialEq, Clone)]
144144
pub struct JoinTable {
145145
pub join_type: JoinType,
146-
pub table: Box<SelectFrom>,
146+
pub table: Box<FromClause>,
147147
pub constraints: Option<JoinConstraint>,
148148
}
149149

src/ast/update.rs

+34-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,36 @@
1+
use super::{
2+
ConflictClause, Expression, FromClause, Identifier, QualifiedTableName, ReturningClause,
3+
};
4+
15
/// An AST for [UPDATE SQL](https://www.sqlite.org/lang_update.html) statement.
26
#[derive(Debug, PartialEq)]
3-
pub struct UpdateStatement {}
7+
pub struct UpdateStatement {
8+
// The conflict clause defined after the OR keyword is used to specify the
9+
// behavior of the UPDATE statement when a constraint violation occurs.
10+
pub conflict_clause: Option<ConflictClause>,
11+
12+
// The table name to update.
13+
pub table_name: QualifiedTableName,
14+
15+
// The set clause to update the table with.
16+
pub set_clause: Vec<SetClause>,
17+
18+
// The from clause to select the rows to update.
19+
pub from_clause: Option<FromClause>,
20+
21+
// The where clause to filter the rows to update.
22+
pub where_clause: Option<Expression>,
23+
24+
// The returning clause to return the updated rows.
25+
pub returning_clause: Option<ReturningClause>,
26+
}
27+
28+
/// A [SetClause](https://www.sqlite.org/syntax/set-clause.html)
29+
#[derive(Debug, PartialEq)]
30+
pub enum SetClause {
31+
/// A single column assignment, e.g. `column = expression`.
32+
ColumnAssignment(Identifier, Expression),
33+
34+
/// A multiple column assignment, e.g. `(column1, column2) = expression`.
35+
MultipleColumnAssignment((Vec<Identifier>, Expression)),
36+
}

src/parser/delete/mod.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ mod test_delete_statements_with_cte {
385385
use super::test_utils::delete_statement_with_cte_clause;
386386
use crate::parser::select::test_utils::select_from;
387387
use crate::parser::test_utils::*;
388-
use crate::{Identifier, QualifiedTableName, SelectFrom};
388+
use crate::{FromClause, Identifier, QualifiedTableName};
389389

390390
#[test]
391391
fn test_delete_with_cte() {
@@ -395,7 +395,7 @@ mod test_delete_statements_with_cte {
395395
Identifier::Single("cte_1".to_string()),
396396
vec![],
397397
None,
398-
select_from(SelectFrom::Table(QualifiedTableName::from(
398+
select_from(FromClause::Table(QualifiedTableName::from(
399399
Identifier::from("cte_table"),
400400
))),
401401
)],
@@ -417,15 +417,15 @@ mod test_delete_statements_with_cte {
417417
Identifier::Single("cte_1".to_string()),
418418
vec![],
419419
None,
420-
select_from(SelectFrom::Table(QualifiedTableName::from(
420+
select_from(FromClause::Table(QualifiedTableName::from(
421421
Identifier::Single("cte_table1".to_string()),
422422
))),
423423
),
424424
cte_expression(
425425
Identifier::Single("cte_2".to_string()),
426426
vec![],
427427
None,
428-
select_from(SelectFrom::Table(QualifiedTableName::from(
428+
select_from(FromClause::Table(QualifiedTableName::from(
429429
Identifier::Single("cte_table2".to_string()),
430430
))),
431431
),

src/parser/mod.rs

+5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ pub(crate) mod expression;
1010
mod select;
1111
mod sqlite;
1212
mod trx;
13+
mod update;
1314
mod window_definition;
1415

1516
#[cfg(test)]
@@ -28,6 +29,7 @@ use expression::ExpressionParser;
2829
use select::{SelectStatementParser, ValuesStatementParser};
2930
use sqlite::SQLite3StatementParser;
3031
use trx::TransactionStatementParser;
32+
use update::UpdateStatementParser;
3133
use window_definition::WindowDefinitionParser;
3234
/// A parser for SQLite SQL statements
3335
pub struct Parser<'a> {
@@ -316,6 +318,9 @@ impl<'a> Parser<'a> {
316318
Keyword::Delete => {
317319
DeleteStatementParser::parse_delete_statement(self).map(Statement::Delete)
318320
}
321+
Keyword::Update => {
322+
UpdateStatementParser::parse_update_statement(self).map(Statement::Update)
323+
}
319324
Keyword::Alter => AlterTableStatementParser::parse_alter_table_statement(self)
320325
.map(Statement::AlterTable),
321326
keyword => Err(ParsingError::UnexpectedKeyword(keyword)),

0 commit comments

Comments
 (0)