@@ -893,7 +893,9 @@ impl Parser {
893893 // Many dialects support `OR REPLACE` | `OR ALTER` right after `CREATE`, but we don't (yet).
894894 // ANSI SQL and Postgres support RECURSIVE here, but we don't support it either.
895895 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 ! [ ] ) ;
897899 let with_options = self . parse_with_options ( ) ?;
898900 self . expect_keyword ( "AS" ) ?;
899901 let query = Box :: new ( self . parse_query ( ) ?) ;
@@ -1017,11 +1019,32 @@ impl Parser {
10171019 ColumnOption :: Unique { is_primary : false }
10181020 } else if self . parse_keyword ( "REFERENCES" ) {
10191021 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 ) ?;
10211024 ColumnOption :: ForeignKey {
10221025 foreign_table,
10231026 referred_columns,
10241027 }
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+ }
10251048 } else if self . parse_keyword ( "CHECK" ) {
10261049 self . expect_token ( & Token :: LParen ) ?;
10271050 let expr = self . parse_expr ( ) ?;
@@ -1048,7 +1071,8 @@ impl Parser {
10481071 if is_primary {
10491072 self . expect_keyword ( "KEY" ) ?;
10501073 }
1051- let columns = self . parse_parenthesized_column_list ( Mandatory ) ?;
1074+ let columns =
1075+ self . parse_parenthesized_column_list ( Mandatory ) ?. unwrap ( ) ;
10521076 Ok ( Some ( TableConstraint :: Unique {
10531077 name,
10541078 columns,
@@ -1057,10 +1081,12 @@ impl Parser {
10571081 }
10581082 Some ( Token :: Word ( ref k) ) if k. keyword == "FOREIGN" => {
10591083 self . expect_keyword ( "KEY" ) ?;
1060- let columns = self . parse_parenthesized_column_list ( Mandatory ) ?;
1084+ let columns =
1085+ self . parse_parenthesized_column_list ( Mandatory ) ?. unwrap ( ) ;
10611086 self . expect_keyword ( "REFERENCES" ) ?;
10621087 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 ( ) ;
10641090 Ok ( Some ( TableConstraint :: ForeignKey {
10651091 name,
10661092 columns,
@@ -1125,7 +1151,9 @@ impl Parser {
11251151 /// Parse a copy statement
11261152 pub fn parse_copy ( & mut self ) -> Result < Statement , ParserError > {
11271153 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 ! [ ] ) ;
11291157 self . expect_keywords ( & [ "FROM" , "STDIN" ] ) ?;
11301158 self . expect_token ( & Token :: SemiColon ) ?;
11311159 let values = self . parse_tsv ( ) ?;
@@ -1345,7 +1373,9 @@ impl Parser {
13451373 ) -> Result < Option < TableAlias > , ParserError > {
13461374 match self . parse_optional_alias ( reserved_kwds) ? {
13471375 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 ! [ ] ) ;
13491379 Ok ( Some ( TableAlias { name, columns } ) )
13501380 }
13511381 None => Ok ( None ) ,
@@ -1377,13 +1407,13 @@ impl Parser {
13771407 pub fn parse_parenthesized_column_list (
13781408 & mut self ,
13791409 optional : IsOptional ,
1380- ) -> Result < Vec < Ident > , ParserError > {
1410+ ) -> Result < Option < Vec < Ident > > , ParserError > {
13811411 if self . consume_token ( & Token :: LParen ) {
13821412 let cols = self . parse_comma_separated ( Parser :: parse_identifier) ?;
13831413 self . expect_token ( & Token :: RParen ) ?;
1384- Ok ( cols)
1414+ Ok ( Some ( cols) )
13851415 } else if optional == Optional {
1386- Ok ( vec ! [ ] )
1416+ Ok ( None )
13871417 } else {
13881418 self . expected ( "a list of columns in parentheses" , self . peek_token ( ) )
13891419 }
@@ -1483,7 +1513,8 @@ impl Parser {
14831513 fn parse_cte ( & mut self ) -> Result < Cte , ParserError > {
14841514 let alias = TableAlias {
14851515 name : self . parse_identifier ( ) ?,
1486- columns : self . parse_parenthesized_column_list ( Optional ) ?,
1516+ columns : self . parse_parenthesized_column_list ( Optional ) ?
1517+ . unwrap_or ( vec ! [ ] ) ,
14871518 } ;
14881519 self . expect_keyword ( "AS" ) ?;
14891520 self . expect_token ( & Token :: LParen ) ?;
@@ -1856,7 +1887,8 @@ impl Parser {
18561887 let constraint = self . parse_expr ( ) ?;
18571888 Ok ( JoinConstraint :: On ( constraint) )
18581889 } 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 ( ) ;
18601892 Ok ( JoinConstraint :: Using ( columns) )
18611893 } else {
18621894 self . expected ( "ON, or USING after JOIN" , self . peek_token ( ) )
@@ -1867,7 +1899,9 @@ impl Parser {
18671899 pub fn parse_insert ( & mut self ) -> Result < Statement , ParserError > {
18681900 self . expect_keyword ( "INTO" ) ?;
18691901 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 ! [ ] ) ;
18711905 let source = Box :: new ( self . parse_query ( ) ?) ;
18721906 Ok ( Statement :: Insert {
18731907 table_name,
0 commit comments