@@ -893,7 +893,9 @@ impl Parser {
893
893
// Many dialects support `OR REPLACE` | `OR ALTER` right after `CREATE`, but we don't (yet).
894
894
// ANSI SQL and Postgres support RECURSIVE here, but we don't support it either.
895
895
let name = self . parse_object_name ( ) ?;
896
- let columns = self . parse_parenthesized_column_list ( Optional ) ?;
896
+ let columns =
897
+ self . parse_parenthesized_column_list ( Optional ) ?
898
+ . unwrap_or ( vec ! [ ] ) ;
897
899
let with_options = self . parse_with_options ( ) ?;
898
900
self . expect_keyword ( "AS" ) ?;
899
901
let query = Box :: new ( self . parse_query ( ) ?) ;
@@ -1017,11 +1019,32 @@ impl Parser {
1017
1019
ColumnOption :: Unique { is_primary : false }
1018
1020
} else if self . parse_keyword ( "REFERENCES" ) {
1019
1021
let foreign_table = self . parse_object_name ( ) ?;
1020
- let referred_columns = self . parse_parenthesized_column_list ( Mandatory ) ?;
1022
+ let referred_columns =
1023
+ self . parse_parenthesized_column_list ( Optional ) ?;
1021
1024
ColumnOption :: ForeignKey {
1022
1025
foreign_table,
1023
1026
referred_columns,
1024
1027
}
1028
+ } else if self . parse_keyword ( "ON" ) {
1029
+ let change_type =
1030
+ if self . parse_keyword ( "DELETE" ) { ReferenceChangeType :: Delete }
1031
+ else if self . parse_keyword ( "UPDATE" ) { ReferenceChangeType :: Update }
1032
+ else {
1033
+ return self . expected ( "DELETE or UPDATE" , self . peek_token ( ) ) ;
1034
+ } ;
1035
+ let action =
1036
+ if self . parse_keyword ( "RESTRICT" ) { ReferenceChangeAction :: Restrict }
1037
+ else if self . parse_keyword ( "CASCADE" ) { ReferenceChangeAction :: Cascade }
1038
+ else if self . parse_keywords ( vec ! [ "SET" , "NULL" ] ) { ReferenceChangeAction :: SetNull }
1039
+ else if self . parse_keywords ( vec ! [ "NO" , "ACTION" ] ) { ReferenceChangeAction :: NoAction }
1040
+ else if self . parse_keywords ( vec ! [ "SET" , "DEFAULT" ] ) { ReferenceChangeAction :: SetDefault }
1041
+ else {
1042
+ return self . expected ( "one of RESTRICT, CASCADE, SET NULL, NO ACTION or SET DEFAULT" , self . peek_token ( ) )
1043
+ } ;
1044
+ ColumnOption :: ReferenceChange {
1045
+ change_type,
1046
+ action,
1047
+ }
1025
1048
} else if self . parse_keyword ( "CHECK" ) {
1026
1049
self . expect_token ( & Token :: LParen ) ?;
1027
1050
let expr = self . parse_expr ( ) ?;
@@ -1048,7 +1071,8 @@ impl Parser {
1048
1071
if is_primary {
1049
1072
self . expect_keyword ( "KEY" ) ?;
1050
1073
}
1051
- let columns = self . parse_parenthesized_column_list ( Mandatory ) ?;
1074
+ let columns =
1075
+ self . parse_parenthesized_column_list ( Mandatory ) ?. unwrap ( ) ;
1052
1076
Ok ( Some ( TableConstraint :: Unique {
1053
1077
name,
1054
1078
columns,
@@ -1057,10 +1081,12 @@ impl Parser {
1057
1081
}
1058
1082
Some ( Token :: Word ( ref k) ) if k. keyword == "FOREIGN" => {
1059
1083
self . expect_keyword ( "KEY" ) ?;
1060
- let columns = self . parse_parenthesized_column_list ( Mandatory ) ?;
1084
+ let columns =
1085
+ self . parse_parenthesized_column_list ( Mandatory ) ?. unwrap ( ) ;
1061
1086
self . expect_keyword ( "REFERENCES" ) ?;
1062
1087
let foreign_table = self . parse_object_name ( ) ?;
1063
- let referred_columns = self . parse_parenthesized_column_list ( Mandatory ) ?;
1088
+ let referred_columns =
1089
+ self . parse_parenthesized_column_list ( Mandatory ) ?. unwrap ( ) ;
1064
1090
Ok ( Some ( TableConstraint :: ForeignKey {
1065
1091
name,
1066
1092
columns,
@@ -1125,7 +1151,9 @@ impl Parser {
1125
1151
/// Parse a copy statement
1126
1152
pub fn parse_copy ( & mut self ) -> Result < Statement , ParserError > {
1127
1153
let table_name = self . parse_object_name ( ) ?;
1128
- let columns = self . parse_parenthesized_column_list ( Optional ) ?;
1154
+ let columns =
1155
+ self . parse_parenthesized_column_list ( Optional ) ?
1156
+ . unwrap_or ( vec ! [ ] ) ;
1129
1157
self . expect_keywords ( & [ "FROM" , "STDIN" ] ) ?;
1130
1158
self . expect_token ( & Token :: SemiColon ) ?;
1131
1159
let values = self . parse_tsv ( ) ?;
@@ -1345,7 +1373,9 @@ impl Parser {
1345
1373
) -> Result < Option < TableAlias > , ParserError > {
1346
1374
match self . parse_optional_alias ( reserved_kwds) ? {
1347
1375
Some ( name) => {
1348
- let columns = self . parse_parenthesized_column_list ( Optional ) ?;
1376
+ let columns =
1377
+ self . parse_parenthesized_column_list ( Optional ) ?
1378
+ . unwrap_or ( vec ! [ ] ) ;
1349
1379
Ok ( Some ( TableAlias { name, columns } ) )
1350
1380
}
1351
1381
None => Ok ( None ) ,
@@ -1377,13 +1407,13 @@ impl Parser {
1377
1407
pub fn parse_parenthesized_column_list (
1378
1408
& mut self ,
1379
1409
optional : IsOptional ,
1380
- ) -> Result < Vec < Ident > , ParserError > {
1410
+ ) -> Result < Option < Vec < Ident > > , ParserError > {
1381
1411
if self . consume_token ( & Token :: LParen ) {
1382
1412
let cols = self . parse_comma_separated ( Parser :: parse_identifier) ?;
1383
1413
self . expect_token ( & Token :: RParen ) ?;
1384
- Ok ( cols)
1414
+ Ok ( Some ( cols) )
1385
1415
} else if optional == Optional {
1386
- Ok ( vec ! [ ] )
1416
+ Ok ( None )
1387
1417
} else {
1388
1418
self . expected ( "a list of columns in parentheses" , self . peek_token ( ) )
1389
1419
}
@@ -1483,7 +1513,8 @@ impl Parser {
1483
1513
fn parse_cte ( & mut self ) -> Result < Cte , ParserError > {
1484
1514
let alias = TableAlias {
1485
1515
name : self . parse_identifier ( ) ?,
1486
- columns : self . parse_parenthesized_column_list ( Optional ) ?,
1516
+ columns : self . parse_parenthesized_column_list ( Optional ) ?
1517
+ . unwrap_or ( vec ! [ ] ) ,
1487
1518
} ;
1488
1519
self . expect_keyword ( "AS" ) ?;
1489
1520
self . expect_token ( & Token :: LParen ) ?;
@@ -1856,7 +1887,8 @@ impl Parser {
1856
1887
let constraint = self . parse_expr ( ) ?;
1857
1888
Ok ( JoinConstraint :: On ( constraint) )
1858
1889
} else if self . parse_keyword ( "USING" ) {
1859
- let columns = self . parse_parenthesized_column_list ( Mandatory ) ?;
1890
+ let columns =
1891
+ self . parse_parenthesized_column_list ( Mandatory ) ?. unwrap ( ) ;
1860
1892
Ok ( JoinConstraint :: Using ( columns) )
1861
1893
} else {
1862
1894
self . expected ( "ON, or USING after JOIN" , self . peek_token ( ) )
@@ -1867,7 +1899,9 @@ impl Parser {
1867
1899
pub fn parse_insert ( & mut self ) -> Result < Statement , ParserError > {
1868
1900
self . expect_keyword ( "INTO" ) ?;
1869
1901
let table_name = self . parse_object_name ( ) ?;
1870
- let columns = self . parse_parenthesized_column_list ( Optional ) ?;
1902
+ let columns =
1903
+ self . parse_parenthesized_column_list ( Optional ) ?
1904
+ . unwrap_or ( vec ! [ ] ) ;
1871
1905
let source = Box :: new ( self . parse_query ( ) ?) ;
1872
1906
Ok ( Statement :: Insert {
1873
1907
table_name,
0 commit comments