@@ -1433,7 +1433,7 @@ impl<'a> Parser<'a> {
1433
1433
///
1434
1434
/// [(1)]: Expr::MatchAgainst
1435
1435
pub fn parse_match_against ( & mut self ) -> Result < Expr , ParserError > {
1436
- let columns = self . parse_parenthesized_column_list ( Mandatory ) ?;
1436
+ let columns = self . parse_parenthesized_column_list ( Mandatory , false ) ?;
1437
1437
1438
1438
self . expect_keyword ( Keyword :: AGAINST ) ?;
1439
1439
@@ -2419,7 +2419,7 @@ impl<'a> Parser<'a> {
2419
2419
// general that the arguments can be made to appear as column
2420
2420
// definitions in a traditional CREATE TABLE statement", but
2421
2421
// we don't implement that.
2422
- let module_args = self . parse_parenthesized_column_list ( Optional ) ?;
2422
+ let module_args = self . parse_parenthesized_column_list ( Optional , false ) ?;
2423
2423
Ok ( Statement :: CreateVirtualTable {
2424
2424
name : table_name,
2425
2425
if_not_exists,
@@ -2698,12 +2698,12 @@ impl<'a> Parser<'a> {
2698
2698
// Many dialects support `OR ALTER` right after `CREATE`, but we don't (yet).
2699
2699
// ANSI SQL and Postgres support RECURSIVE here, but we don't support it either.
2700
2700
let name = self . parse_object_name ( ) ?;
2701
- let columns = self . parse_parenthesized_column_list ( Optional ) ?;
2701
+ let columns = self . parse_parenthesized_column_list ( Optional , false ) ?;
2702
2702
let with_options = self . parse_options ( Keyword :: WITH ) ?;
2703
2703
2704
2704
let cluster_by = if self . parse_keyword ( Keyword :: CLUSTER ) {
2705
2705
self . expect_keyword ( Keyword :: BY ) ?;
2706
- self . parse_parenthesized_column_list ( Optional ) ?
2706
+ self . parse_parenthesized_column_list ( Optional , false ) ?
2707
2707
} else {
2708
2708
vec ! [ ]
2709
2709
} ;
@@ -3441,7 +3441,7 @@ impl<'a> Parser<'a> {
3441
3441
let foreign_table = self . parse_object_name ( ) ?;
3442
3442
// PostgreSQL allows omitting the column list and
3443
3443
// uses the primary key column of the foreign table by default
3444
- let referred_columns = self . parse_parenthesized_column_list ( Optional ) ?;
3444
+ let referred_columns = self . parse_parenthesized_column_list ( Optional , false ) ?;
3445
3445
let mut on_delete = None ;
3446
3446
let mut on_update = None ;
3447
3447
loop {
@@ -3525,7 +3525,7 @@ impl<'a> Parser<'a> {
3525
3525
if is_primary {
3526
3526
self . expect_keyword ( Keyword :: KEY ) ?;
3527
3527
}
3528
- let columns = self . parse_parenthesized_column_list ( Mandatory ) ?;
3528
+ let columns = self . parse_parenthesized_column_list ( Mandatory , false ) ?;
3529
3529
Ok ( Some ( TableConstraint :: Unique {
3530
3530
name,
3531
3531
columns,
@@ -3534,10 +3534,10 @@ impl<'a> Parser<'a> {
3534
3534
}
3535
3535
Token :: Word ( w) if w. keyword == Keyword :: FOREIGN => {
3536
3536
self . expect_keyword ( Keyword :: KEY ) ?;
3537
- let columns = self . parse_parenthesized_column_list ( Mandatory ) ?;
3537
+ let columns = self . parse_parenthesized_column_list ( Mandatory , false ) ?;
3538
3538
self . expect_keyword ( Keyword :: REFERENCES ) ?;
3539
3539
let foreign_table = self . parse_object_name ( ) ?;
3540
- let referred_columns = self . parse_parenthesized_column_list ( Mandatory ) ?;
3540
+ let referred_columns = self . parse_parenthesized_column_list ( Mandatory , false ) ?;
3541
3541
let mut on_delete = None ;
3542
3542
let mut on_update = None ;
3543
3543
loop {
@@ -3582,7 +3582,7 @@ impl<'a> Parser<'a> {
3582
3582
} else {
3583
3583
None
3584
3584
} ;
3585
- let columns = self . parse_parenthesized_column_list ( Mandatory ) ?;
3585
+ let columns = self . parse_parenthesized_column_list ( Mandatory , false ) ?;
3586
3586
3587
3587
Ok ( Some ( TableConstraint :: Index {
3588
3588
display_as_key,
@@ -3617,7 +3617,7 @@ impl<'a> Parser<'a> {
3617
3617
3618
3618
let opt_index_name = self . maybe_parse ( |parser| parser. parse_identifier ( ) ) ;
3619
3619
3620
- let columns = self . parse_parenthesized_column_list ( Mandatory ) ?;
3620
+ let columns = self . parse_parenthesized_column_list ( Mandatory , false ) ?;
3621
3621
3622
3622
Ok ( Some ( TableConstraint :: FulltextOrSpatial {
3623
3623
fulltext,
@@ -3864,7 +3864,7 @@ impl<'a> Parser<'a> {
3864
3864
/// Parse a copy statement
3865
3865
pub fn parse_copy ( & mut self ) -> Result < Statement , ParserError > {
3866
3866
let table_name = self . parse_object_name ( ) ?;
3867
- let columns = self . parse_parenthesized_column_list ( Optional ) ?;
3867
+ let columns = self . parse_parenthesized_column_list ( Optional , false ) ?;
3868
3868
let to = match self . parse_one_of_keywords ( & [ Keyword :: FROM , Keyword :: TO ] ) {
3869
3869
Some ( Keyword :: FROM ) => false ,
3870
3870
Some ( Keyword :: TO ) => true ,
@@ -3950,13 +3950,13 @@ impl<'a> Parser<'a> {
3950
3950
Some ( Keyword :: QUOTE ) => CopyOption :: Quote ( self . parse_literal_char ( ) ?) ,
3951
3951
Some ( Keyword :: ESCAPE ) => CopyOption :: Escape ( self . parse_literal_char ( ) ?) ,
3952
3952
Some ( Keyword :: FORCE_QUOTE ) => {
3953
- CopyOption :: ForceQuote ( self . parse_parenthesized_column_list ( Mandatory ) ?)
3953
+ CopyOption :: ForceQuote ( self . parse_parenthesized_column_list ( Mandatory , false ) ?)
3954
3954
}
3955
3955
Some ( Keyword :: FORCE_NOT_NULL ) => {
3956
- CopyOption :: ForceNotNull ( self . parse_parenthesized_column_list ( Mandatory ) ?)
3956
+ CopyOption :: ForceNotNull ( self . parse_parenthesized_column_list ( Mandatory , false ) ?)
3957
3957
}
3958
3958
Some ( Keyword :: FORCE_NULL ) => {
3959
- CopyOption :: ForceNull ( self . parse_parenthesized_column_list ( Mandatory ) ?)
3959
+ CopyOption :: ForceNull ( self . parse_parenthesized_column_list ( Mandatory , false ) ?)
3960
3960
}
3961
3961
Some ( Keyword :: ENCODING ) => CopyOption :: Encoding ( self . parse_literal_string ( ) ?) ,
3962
3962
_ => self . expected ( "option" , self . peek_token ( ) ) ?,
@@ -4454,7 +4454,7 @@ impl<'a> Parser<'a> {
4454
4454
) -> Result < Option < TableAlias > , ParserError > {
4455
4455
match self . parse_optional_alias ( reserved_kwds) ? {
4456
4456
Some ( name) => {
4457
- let columns = self . parse_parenthesized_column_list ( Optional ) ?;
4457
+ let columns = self . parse_parenthesized_column_list ( Optional , false ) ?;
4458
4458
Ok ( Some ( TableAlias { name, columns } ) )
4459
4459
}
4460
4460
None => Ok ( None ) ,
@@ -4505,11 +4505,17 @@ impl<'a> Parser<'a> {
4505
4505
pub fn parse_parenthesized_column_list (
4506
4506
& mut self ,
4507
4507
optional : IsOptional ,
4508
+ allow_empty : bool ,
4508
4509
) -> Result < Vec < Ident > , ParserError > {
4509
4510
if self . consume_token ( & Token :: LParen ) {
4510
- let cols = self . parse_comma_separated ( Parser :: parse_identifier) ?;
4511
- self . expect_token ( & Token :: RParen ) ?;
4512
- Ok ( cols)
4511
+ if allow_empty && self . peek_token ( ) . token == Token :: RParen {
4512
+ self . next_token ( ) ;
4513
+ Ok ( vec ! [ ] )
4514
+ } else {
4515
+ let cols = self . parse_comma_separated ( Parser :: parse_identifier) ?;
4516
+ self . expect_token ( & Token :: RParen ) ?;
4517
+ Ok ( cols)
4518
+ }
4513
4519
} else if optional == Optional {
4514
4520
Ok ( vec ! [ ] )
4515
4521
} else {
@@ -4811,7 +4817,7 @@ impl<'a> Parser<'a> {
4811
4817
from : None ,
4812
4818
}
4813
4819
} else {
4814
- let columns = self . parse_parenthesized_column_list ( Optional ) ?;
4820
+ let columns = self . parse_parenthesized_column_list ( Optional , false ) ?;
4815
4821
self . expect_keyword ( Keyword :: AS ) ?;
4816
4822
self . expect_token ( & Token :: LParen ) ?;
4817
4823
let query = Box :: new ( self . parse_query ( ) ?) ;
@@ -4848,7 +4854,8 @@ impl<'a> Parser<'a> {
4848
4854
self . expect_token ( & Token :: RParen ) ?;
4849
4855
SetExpr :: Query ( Box :: new ( subquery) )
4850
4856
} else if self . parse_keyword ( Keyword :: VALUES ) {
4851
- SetExpr :: Values ( self . parse_values ( ) ?)
4857
+ let is_mysql = dialect_of ! ( self is MySqlDialect ) ;
4858
+ SetExpr :: Values ( self . parse_values ( is_mysql) ?)
4852
4859
} else if self . parse_keyword ( Keyword :: TABLE ) {
4853
4860
SetExpr :: Table ( Box :: new ( self . parse_as_table ( ) ?) )
4854
4861
} else {
@@ -5645,7 +5652,7 @@ impl<'a> Parser<'a> {
5645
5652
let constraint = self . parse_expr ( ) ?;
5646
5653
Ok ( JoinConstraint :: On ( constraint) )
5647
5654
} else if self . parse_keyword ( Keyword :: USING ) {
5648
- let columns = self . parse_parenthesized_column_list ( Mandatory ) ?;
5655
+ let columns = self . parse_parenthesized_column_list ( Mandatory , false ) ?;
5649
5656
Ok ( JoinConstraint :: Using ( columns) )
5650
5657
} else {
5651
5658
Ok ( JoinConstraint :: None )
@@ -5770,7 +5777,7 @@ impl<'a> Parser<'a> {
5770
5777
] ) {
5771
5778
let columns = match kw {
5772
5779
Keyword :: INSERT | Keyword :: REFERENCES | Keyword :: SELECT | Keyword :: UPDATE => {
5773
- let columns = self . parse_parenthesized_column_list ( Optional ) ?;
5780
+ let columns = self . parse_parenthesized_column_list ( Optional , false ) ?;
5774
5781
if columns. is_empty ( ) {
5775
5782
None
5776
5783
} else {
@@ -5856,7 +5863,8 @@ impl<'a> Parser<'a> {
5856
5863
// Hive lets you put table here regardless
5857
5864
let table = self . parse_keyword ( Keyword :: TABLE ) ;
5858
5865
let table_name = self . parse_object_name ( ) ?;
5859
- let columns = self . parse_parenthesized_column_list ( Optional ) ?;
5866
+ let is_mysql = dialect_of ! ( self is MySqlDialect ) ;
5867
+ let columns = self . parse_parenthesized_column_list ( Optional , is_mysql) ?;
5860
5868
5861
5869
let partitioned = if self . parse_keyword ( Keyword :: PARTITION ) {
5862
5870
self . expect_token ( & Token :: LParen ) ?;
@@ -5868,7 +5876,7 @@ impl<'a> Parser<'a> {
5868
5876
} ;
5869
5877
5870
5878
// Hive allows you to specify columns after partitions as well if you want.
5871
- let after_columns = self . parse_parenthesized_column_list ( Optional ) ?;
5879
+ let after_columns = self . parse_parenthesized_column_list ( Optional , false ) ?;
5872
5880
5873
5881
let source = Box :: new ( self . parse_query ( ) ?) ;
5874
5882
let on = if self . parse_keyword ( Keyword :: ON ) {
@@ -5878,7 +5886,7 @@ impl<'a> Parser<'a> {
5878
5886
Some ( ConflictTarget :: OnConstraint ( self . parse_object_name ( ) ?) )
5879
5887
} else if self . peek_token ( ) == Token :: LParen {
5880
5888
Some ( ConflictTarget :: Columns (
5881
- self . parse_parenthesized_column_list ( IsOptional :: Mandatory ) ?,
5889
+ self . parse_parenthesized_column_list ( IsOptional :: Mandatory , false ) ?,
5882
5890
) )
5883
5891
} else {
5884
5892
None
@@ -6091,7 +6099,7 @@ impl<'a> Parser<'a> {
6091
6099
& mut self ,
6092
6100
) -> Result < Option < ExceptSelectItem > , ParserError > {
6093
6101
let opt_except = if self . parse_keyword ( Keyword :: EXCEPT ) {
6094
- let idents = self . parse_parenthesized_column_list ( Mandatory ) ?;
6102
+ let idents = self . parse_parenthesized_column_list ( Mandatory , false ) ?;
6095
6103
match & idents[ ..] {
6096
6104
[ ] => {
6097
6105
return self . expected (
@@ -6236,7 +6244,7 @@ impl<'a> Parser<'a> {
6236
6244
} )
6237
6245
}
6238
6246
6239
- pub fn parse_values ( & mut self ) -> Result < Values , ParserError > {
6247
+ pub fn parse_values ( & mut self , allow_empty : bool ) -> Result < Values , ParserError > {
6240
6248
let mut explicit_row = false ;
6241
6249
6242
6250
let rows = self . parse_comma_separated ( |parser| {
@@ -6245,9 +6253,14 @@ impl<'a> Parser<'a> {
6245
6253
}
6246
6254
6247
6255
parser. expect_token ( & Token :: LParen ) ?;
6248
- let exprs = parser. parse_comma_separated ( Parser :: parse_expr) ?;
6249
- parser. expect_token ( & Token :: RParen ) ?;
6250
- Ok ( exprs)
6256
+ if allow_empty && parser. peek_token ( ) . token == Token :: RParen {
6257
+ parser. next_token ( ) ;
6258
+ Ok ( vec ! [ ] )
6259
+ } else {
6260
+ let exprs = parser. parse_comma_separated ( Parser :: parse_expr) ?;
6261
+ parser. expect_token ( & Token :: RParen ) ?;
6262
+ Ok ( exprs)
6263
+ }
6251
6264
} ) ?;
6252
6265
Ok ( Values { explicit_row, rows } )
6253
6266
}
@@ -6413,9 +6426,10 @@ impl<'a> Parser<'a> {
6413
6426
"INSERT in MATCHED merge clause" . to_string ( ) ,
6414
6427
) ) ;
6415
6428
}
6416
- let columns = self . parse_parenthesized_column_list ( Optional ) ?;
6429
+ let is_mysql = dialect_of ! ( self is MySqlDialect ) ;
6430
+ let columns = self . parse_parenthesized_column_list ( Optional , is_mysql) ?;
6417
6431
self . expect_keyword ( Keyword :: VALUES ) ?;
6418
- let values = self . parse_values ( ) ?;
6432
+ let values = self . parse_values ( is_mysql ) ?;
6419
6433
MergeClause :: NotMatched {
6420
6434
predicate,
6421
6435
columns,
0 commit comments