Skip to content

Commit d032c3c

Browse files
committed
Remove PG dialect check for insert with DEFAULT VALUES and refactor
1 parent bc25af8 commit d032c3c

File tree

3 files changed

+76
-33
lines changed

3 files changed

+76
-33
lines changed

src/parser/mod.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7090,15 +7090,13 @@ impl<'a> Parser<'a> {
70907090
let table = self.parse_keyword(Keyword::TABLE);
70917091
let table_name = self.parse_object_name()?;
70927092
let is_mysql = dialect_of!(self is MySqlDialect);
7093-
let is_postgresql = dialect_of!(self is PostgreSqlDialect);
70947093

7095-
let is_postgresql_default_values =
7096-
is_postgresql && self.parse_keywords(&[Keyword::DEFAULT, Keyword::VALUES]);
7094+
let is_default_values = self.parse_keywords(&[Keyword::DEFAULT, Keyword::VALUES]);
70977095

7098-
let columns: Vec<Ident> = if !is_postgresql_default_values {
7099-
self.parse_parenthesized_column_list(Optional, is_mysql)?
7100-
} else {
7096+
let columns = if is_default_values {
71017097
vec![]
7098+
} else {
7099+
self.parse_parenthesized_column_list(Optional, is_mysql)?
71027100
};
71037101

71047102
let partitioned = if self.parse_keyword(Keyword::PARTITION) {
@@ -7113,10 +7111,10 @@ impl<'a> Parser<'a> {
71137111
// Hive allows you to specify columns after partitions as well if you want.
71147112
let after_columns = self.parse_parenthesized_column_list(Optional, false)?;
71157113

7116-
let source = if !is_postgresql_default_values {
7117-
Some(Box::new(self.parse_query()?))
7118-
} else {
7114+
let source = if is_default_values {
71197115
None
7116+
} else {
7117+
Some(Box::new(self.parse_query()?))
71207118
};
71217119

71227120
let on = if self.parse_keyword(Keyword::ON) {

tests/sqlparser_common.rs

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,15 +85,15 @@ fn parse_insert_values() {
8585
Statement::Insert {
8686
table_name,
8787
columns,
88-
source,
88+
source: Some(source),
8989
..
9090
} => {
9191
assert_eq!(table_name.to_string(), expected_table_name);
9292
assert_eq!(columns.len(), expected_columns.len());
9393
for (index, column) in columns.iter().enumerate() {
9494
assert_eq!(column, &Ident::new(expected_columns[index].clone()));
9595
}
96-
match &*source.as_ref().unwrap().body {
96+
match *source.body {
9797
SetExpr::Values(Values { rows, .. }) => {
9898
assert_eq!(rows.as_slice(), expected_rows)
9999
}
@@ -107,6 +107,71 @@ fn parse_insert_values() {
107107
verified_stmt("INSERT INTO customer WITH foo AS (SELECT 1) SELECT * FROM foo UNION VALUES (1)");
108108
}
109109

110+
#[test]
111+
fn parse_insert_default_values() {
112+
let insert_with_default_values = verified_stmt("INSERT INTO test_table DEFAULT VALUES");
113+
114+
match insert_with_default_values {
115+
Statement::Insert {
116+
columns,
117+
on,
118+
returning,
119+
source,
120+
table_name,
121+
..
122+
} => {
123+
assert_eq!(columns, vec![]);
124+
assert_eq!(on, None);
125+
assert_eq!(returning, None);
126+
assert_eq!(source, None);
127+
assert_eq!(table_name, ObjectName(vec!["test_table".into()]));
128+
}
129+
_ => unreachable!(),
130+
}
131+
132+
let insert_with_default_values_and_returning =
133+
verified_stmt("INSERT INTO test_table DEFAULT VALUES RETURNING test_column");
134+
135+
match insert_with_default_values_and_returning {
136+
Statement::Insert {
137+
columns,
138+
on,
139+
returning,
140+
source,
141+
table_name,
142+
..
143+
} => {
144+
assert_eq!(columns, vec![]);
145+
assert_eq!(on, None);
146+
assert!(returning.is_some());
147+
assert_eq!(source, None);
148+
assert_eq!(table_name, ObjectName(vec!["test_table".into()]));
149+
}
150+
_ => unreachable!(),
151+
}
152+
153+
let insert_with_default_values_and_on_conflict =
154+
verified_stmt("INSERT INTO test_table DEFAULT VALUES ON CONFLICT DO NOTHING");
155+
156+
match insert_with_default_values_and_on_conflict {
157+
Statement::Insert {
158+
columns,
159+
on,
160+
returning,
161+
source,
162+
table_name,
163+
..
164+
} => {
165+
assert_eq!(columns, vec![]);
166+
assert!(on.is_some());
167+
assert_eq!(returning, None);
168+
assert_eq!(source, None);
169+
assert_eq!(table_name, ObjectName(vec!["test_table".into()]));
170+
}
171+
_ => unreachable!(),
172+
}
173+
}
174+
110175
#[test]
111176
fn parse_insert_sqlite() {
112177
let dialect = SQLiteDialect {};

tests/sqlparser_postgres.rs

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1372,7 +1372,7 @@ fn parse_prepare() {
13721372
Statement::Insert {
13731373
table_name,
13741374
columns,
1375-
source,
1375+
source: Some(source),
13761376
..
13771377
} => {
13781378
assert_eq!(table_name.to_string(), "customers");
@@ -1383,7 +1383,7 @@ fn parse_prepare() {
13831383
Expr::Identifier("a2".into()),
13841384
Expr::Identifier("a3".into()),
13851385
]];
1386-
match &*source.as_ref().unwrap().body {
1386+
match &*source.body {
13871387
SetExpr::Values(Values { rows, .. }) => {
13881388
assert_eq!(rows.as_slice(), &expected_values)
13891389
}
@@ -3502,23 +3502,3 @@ fn parse_join_constraint_unnest_alias() {
35023502
}]
35033503
);
35043504
}
3505-
3506-
// TODO: more tests with `ON CONFLICT`, `RETURNING`, ... any others?
3507-
#[test]
3508-
fn parse_insert_default_values() {
3509-
let stmt = pg().verified_stmt("INSERT INTO users DEFAULT VALUES");
3510-
3511-
match stmt {
3512-
Statement::Insert {
3513-
columns,
3514-
source,
3515-
table_name,
3516-
..
3517-
} => {
3518-
assert_eq!(columns, vec![]);
3519-
assert_eq!(source, None);
3520-
assert_eq!(table_name, ObjectName(vec!["users".into()]));
3521-
}
3522-
_ => unreachable!(),
3523-
}
3524-
}

0 commit comments

Comments
 (0)