Skip to content

Commit 255e50c

Browse files
authored
Allow INSERT columns to be qualified (#2260)
1 parent 1da2ff7 commit 255e50c

File tree

7 files changed

+88
-30
lines changed

7 files changed

+88
-30
lines changed

src/ast/dml.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ pub struct Insert {
6161
/// `table_name foo` (for Oracle)
6262
pub table_alias: Option<TableAliasWithoutColumns>,
6363
/// COLUMNS
64-
pub columns: Vec<Ident>,
64+
pub columns: Vec<ObjectName>,
6565
/// Overwrite (Hive)
6666
pub overwrite: bool,
6767
/// A SQL query that specifies what to insert

src/ast/spans.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1335,7 +1335,7 @@ impl Spanned for Insert {
13351335
core::iter::once(insert_token.0.span)
13361336
.chain(core::iter::once(table.span()))
13371337
.chain(table_alias.iter().map(|k| k.alias.span))
1338-
.chain(columns.iter().map(|i| i.span))
1338+
.chain(columns.iter().map(|i| i.span()))
13391339
.chain(source.as_ref().map(|q| q.span()))
13401340
.chain(assignments.iter().map(|i| i.span()))
13411341
.chain(partitioned.iter().flat_map(|i| i.iter().map(|k| k.span())))

src/parser/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17319,7 +17319,8 @@ impl<'a> Parser<'a> {
1731917319
(vec![], None, vec![], None, None, vec![])
1732017320
} else {
1732117321
let (columns, partitioned, after_columns) = if !self.peek_subquery_start() {
17322-
let columns = self.parse_parenthesized_column_list(Optional, is_mysql)?;
17322+
let columns =
17323+
self.parse_parenthesized_qualified_column_list(Optional, is_mysql)?;
1732317324

1732417325
let partitioned = self.parse_insert_partition()?;
1732517326
// Hive allows you to specify columns after partitions as well if you want.

tests/sqlparser_common.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,10 @@ fn parse_insert_values() {
153153
assert_eq!(table_name.to_string(), expected_table_name);
154154
assert_eq!(columns.len(), expected_columns.len());
155155
for (index, column) in columns.iter().enumerate() {
156-
assert_eq!(column, &Ident::new(expected_columns[index].clone()));
156+
assert_eq!(
157+
column,
158+
&ObjectName::from(Ident::new(expected_columns[index].clone()))
159+
);
157160
}
158161
match *source.body {
159162
SetExpr::Values(Values {

tests/sqlparser_mysql.rs

Lines changed: 53 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1913,7 +1913,13 @@ fn parse_simple_insert() {
19131913
TableObject::TableName(ObjectName::from(vec![Ident::new("tasks")])),
19141914
table_name
19151915
);
1916-
assert_eq!(vec![Ident::new("title"), Ident::new("priority")], columns);
1916+
assert_eq!(
1917+
vec![
1918+
ObjectName::from(Ident::new("title")),
1919+
ObjectName::from(Ident::new("priority"))
1920+
],
1921+
columns
1922+
);
19171923
assert!(on.is_none());
19181924
assert_eq!(
19191925
Some(Box::new(Query {
@@ -1978,7 +1984,13 @@ fn parse_ignore_insert() {
19781984
TableObject::TableName(ObjectName::from(vec![Ident::new("tasks")])),
19791985
table_name
19801986
);
1981-
assert_eq!(vec![Ident::new("title"), Ident::new("priority")], columns);
1987+
assert_eq!(
1988+
vec![
1989+
ObjectName::from(Ident::new("title")),
1990+
ObjectName::from(Ident::new("priority"))
1991+
],
1992+
columns
1993+
);
19821994
assert!(on.is_none());
19831995
assert!(ignore);
19841996
assert_eq!(
@@ -2028,7 +2040,13 @@ fn parse_priority_insert() {
20282040
TableObject::TableName(ObjectName::from(vec![Ident::new("tasks")])),
20292041
table_name
20302042
);
2031-
assert_eq!(vec![Ident::new("title"), Ident::new("priority")], columns);
2043+
assert_eq!(
2044+
vec![
2045+
ObjectName::from(Ident::new("title")),
2046+
ObjectName::from(Ident::new("priority"))
2047+
],
2048+
columns
2049+
);
20322050
assert!(on.is_none());
20332051
assert_eq!(priority, Some(HighPriority));
20342052
assert_eq!(
@@ -2075,7 +2093,13 @@ fn parse_priority_insert() {
20752093
TableObject::TableName(ObjectName::from(vec![Ident::new("tasks")])),
20762094
table_name
20772095
);
2078-
assert_eq!(vec![Ident::new("title"), Ident::new("priority")], columns);
2096+
assert_eq!(
2097+
vec![
2098+
ObjectName::from(Ident::new("title")),
2099+
ObjectName::from(Ident::new("priority"))
2100+
],
2101+
columns
2102+
);
20792103
assert!(on.is_none());
20802104
assert_eq!(priority, Some(LowPriority));
20812105
assert_eq!(
@@ -2123,7 +2147,10 @@ fn parse_insert_as() {
21232147
TableObject::TableName(ObjectName::from(vec![Ident::with_quote('`', "table")])),
21242148
table_name
21252149
);
2126-
assert_eq!(vec![Ident::with_quote('`', "date")], columns);
2150+
assert_eq!(
2151+
vec![ObjectName::from(Ident::with_quote('`', "date"))],
2152+
columns
2153+
);
21272154
let insert_alias = insert_alias.unwrap();
21282155

21292156
assert_eq!(
@@ -2176,7 +2203,10 @@ fn parse_insert_as() {
21762203
table_name
21772204
);
21782205
assert_eq!(
2179-
vec![Ident::with_quote('`', "id"), Ident::with_quote('`', "date")],
2206+
vec![
2207+
ObjectName::from(Ident::with_quote('`', "id")),
2208+
ObjectName::from(Ident::with_quote('`', "date"))
2209+
],
21802210
columns
21812211
);
21822212
let insert_alias = insert_alias.unwrap();
@@ -2238,7 +2268,13 @@ fn parse_replace_insert() {
22382268
TableObject::TableName(ObjectName::from(vec![Ident::new("tasks")])),
22392269
table_name
22402270
);
2241-
assert_eq!(vec![Ident::new("title"), Ident::new("priority")], columns);
2271+
assert_eq!(
2272+
vec![
2273+
ObjectName::from(Ident::new("title")),
2274+
ObjectName::from(Ident::new("priority"))
2275+
],
2276+
columns
2277+
);
22422278
assert!(on.is_none());
22432279
assert!(replace_into);
22442280
assert_eq!(priority, Some(Delayed));
@@ -2332,12 +2368,12 @@ fn parse_insert_with_on_duplicate_update() {
23322368
);
23332369
assert_eq!(
23342370
vec![
2335-
Ident::new("name"),
2336-
Ident::new("description"),
2337-
Ident::new("perm_create"),
2338-
Ident::new("perm_read"),
2339-
Ident::new("perm_update"),
2340-
Ident::new("perm_delete")
2371+
ObjectName::from(Ident::new("name")),
2372+
ObjectName::from(Ident::new("description")),
2373+
ObjectName::from(Ident::new("perm_create")),
2374+
ObjectName::from(Ident::new("perm_read")),
2375+
ObjectName::from(Ident::new("perm_update")),
2376+
ObjectName::from(Ident::new("perm_delete"))
23412377
],
23422378
columns
23432379
);
@@ -2651,7 +2687,10 @@ fn parse_insert_with_numeric_prefix_column_name() {
26512687
TableObject::TableName(ObjectName::from(vec![Ident::new("s1"), Ident::new("t1")])),
26522688
table_name
26532689
);
2654-
assert_eq!(vec![Ident::new("123col_$@length123")], columns);
2690+
assert_eq!(
2691+
vec![ObjectName::from(Ident::new("123col_$@length123"))],
2692+
columns
2693+
);
26552694
}
26562695
_ => unreachable!(),
26572696
}

tests/sqlparser_oracle.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,21 @@ fn test_insert_with_table_alias() {
475475
VALUES (1, 2, 3)",
476476
);
477477
verify_table_name_with_alias(&stmt, "foo_t", "t");
478+
479+
let stmt =
480+
oracle_dialect.verified_stmt("INSERT INTO foo_t t (t.id, t.val) SELECT 1, 2 FROM dual");
481+
verify_table_name_with_alias(&stmt, "foo_t", "t");
482+
if let Statement::Insert(Insert { columns, .. }) = stmt {
483+
assert_eq!(
484+
vec![
485+
ObjectName::from(vec![Ident::new("t"), Ident::new("id")]),
486+
ObjectName::from(vec![Ident::new("t"), Ident::new("val")])
487+
],
488+
columns
489+
);
490+
} else {
491+
panic!("not an insert statement");
492+
};
478493
}
479494

480495
#[test]

tests/sqlparser_postgres.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5493,16 +5493,16 @@ fn test_simple_postgres_insert_with_alias() {
54935493
}
54945494
}),
54955495
columns: vec![
5496-
Ident {
5496+
ObjectName::from(Ident {
54975497
value: "id".to_string(),
54985498
quote_style: None,
54995499
span: Span::empty(),
5500-
},
5501-
Ident {
5500+
}),
5501+
ObjectName::from(Ident {
55025502
value: "a".to_string(),
55035503
quote_style: None,
55045504
span: Span::empty(),
5505-
}
5505+
})
55065506
],
55075507
overwrite: false,
55085508
source: Some(Box::new(Query {
@@ -5573,16 +5573,16 @@ fn test_simple_postgres_insert_with_alias() {
55735573
}
55745574
}),
55755575
columns: vec![
5576-
Ident {
5576+
ObjectName::from(Ident {
55775577
value: "id".to_string(),
55785578
quote_style: None,
55795579
span: Span::empty(),
5580-
},
5581-
Ident {
5580+
}),
5581+
ObjectName::from(Ident {
55825582
value: "a".to_string(),
55835583
quote_style: None,
55845584
span: Span::empty(),
5585-
}
5585+
})
55865586
],
55875587
overwrite: false,
55885588
source: Some(Box::new(Query {
@@ -5655,16 +5655,16 @@ fn test_simple_insert_with_quoted_alias() {
56555655
}
56565656
}),
56575657
columns: vec![
5658-
Ident {
5658+
ObjectName::from(Ident {
56595659
value: "id".to_string(),
56605660
quote_style: None,
56615661
span: Span::empty(),
5662-
},
5663-
Ident {
5662+
}),
5663+
ObjectName::from(Ident {
56645664
value: "a".to_string(),
56655665
quote_style: None,
56665666
span: Span::empty(),
5667-
}
5667+
})
56685668
],
56695669
overwrite: false,
56705670
source: Some(Box::new(Query {

0 commit comments

Comments
 (0)