@@ -28,6 +28,7 @@ pub enum ParserError {
2828}
2929
3030pub type WildcardExcept = Vec < Ident > ;
31+ pub type WildcardExclude = Vec < Ident > ;
3132pub type WildcardReplace = Vec < ( Expr , Ident ) > ;
3233
3334// Use `Parser::expected` instead, if possible
@@ -2871,17 +2872,19 @@ impl<'a> Parser<'a> {
28712872 pub fn parse_select_item ( & mut self ) -> Result < SelectItem , ParserError > {
28722873 let expr = self . parse_expr ( ) ?;
28732874 if let Expr :: Wildcard = expr {
2874- let ( except, replace) = self . parse_wildcard_modifiers ( ) ?;
2875+ let ( except, exclude , replace) = self . parse_wildcard_modifiers ( ) ?;
28752876 Ok ( SelectItem :: Wildcard {
28762877 prefix : None ,
28772878 except,
2879+ exclude,
28782880 replace,
28792881 } )
28802882 } else if let Expr :: QualifiedWildcard ( prefix) = expr {
2881- let ( except, replace) = self . parse_wildcard_modifiers ( ) ?;
2883+ let ( except, exclude , replace) = self . parse_wildcard_modifiers ( ) ?;
28822884 Ok ( SelectItem :: Wildcard {
28832885 prefix : Some ( ObjectName ( prefix) ) ,
28842886 except,
2887+ exclude,
28852888 replace,
28862889 } )
28872890 } else {
@@ -2908,7 +2911,7 @@ impl<'a> Parser<'a> {
29082911
29092912 pub fn parse_wildcard_modifiers (
29102913 & mut self ,
2911- ) -> Result < ( WildcardExcept , WildcardReplace ) , ParserError > {
2914+ ) -> Result < ( WildcardExcept , WildcardExclude , WildcardReplace ) , ParserError > {
29122915 let except = if self . parse_keyword ( Keyword :: EXCEPT ) {
29132916 self . expect_token ( & Token :: LParen ) ?;
29142917 let aliases = self . parse_comma_separated ( Parser :: parse_identifier) ?;
@@ -2917,15 +2920,26 @@ impl<'a> Parser<'a> {
29172920 } else {
29182921 vec ! [ ]
29192922 } ;
2920- let replace = if self . parse_keyword ( Keyword :: EXCEPT ) {
2923+ let exclude = if self . parse_keyword ( Keyword :: EXCLUDE ) {
2924+ if self . consume_token ( & Token :: LParen ) {
2925+ let aliases = self . parse_comma_separated ( Parser :: parse_identifier) ?;
2926+ self . expect_token ( & Token :: RParen ) ?;
2927+ aliases
2928+ } else {
2929+ vec ! [ self . parse_identifier( ) ?]
2930+ }
2931+ } else {
2932+ vec ! [ ]
2933+ } ;
2934+ let replace = if self . parse_keyword ( Keyword :: REPLACE ) {
29212935 self . expect_token ( & Token :: LParen ) ?;
29222936 let replace = self . parse_comma_separated ( Parser :: parse_replace_item) ?;
29232937 self . expect_token ( & Token :: RParen ) ?;
29242938 replace
29252939 } else {
29262940 vec ! [ ]
29272941 } ;
2928- Ok ( ( except, replace) )
2942+ Ok ( ( except, exclude , replace) )
29292943 }
29302944
29312945 /// Parse an expression, optionally followed by ASC or DESC (used in ORDER BY)
0 commit comments