@@ -125,9 +125,9 @@ impl Parser {
125125 "UPDATE" => Ok ( self . parse_update ( ) ?) ,
126126 "ALTER" => Ok ( self . parse_alter ( ) ?) ,
127127 "COPY" => Ok ( self . parse_copy ( ) ?) ,
128+ "SET" => Ok ( self . parse_set ( ) ?) ,
128129 "SHOW" => Ok ( self . parse_show ( ) ?) ,
129130 "START" => Ok ( self . parse_start_transaction ( ) ?) ,
130- "SET" => Ok ( self . parse_set_transaction ( ) ?) ,
131131 // `BEGIN` is a nonstandard but common alias for the
132132 // standard `START TRANSACTION` statement. It is supported
133133 // by at least PostgreSQL and MySQL.
@@ -1593,6 +1593,30 @@ impl Parser {
15931593 } )
15941594 }
15951595
1596+ pub fn parse_set ( & mut self ) -> Result < Statement , ParserError > {
1597+ let modifier = self . parse_one_of_keywords ( & [ "SESSION" , "LOCAL" ] ) ;
1598+ let variable = self . parse_identifier ( ) ?;
1599+ if self . consume_token ( & Token :: Eq ) || self . parse_keyword ( "TO" ) {
1600+ let token = self . peek_token ( ) ;
1601+ let value = match ( self . parse_value ( ) , token) {
1602+ ( Ok ( value) , _) => SetVariableValue :: Literal ( value) ,
1603+ ( Err ( _) , Some ( Token :: Word ( ident) ) ) => SetVariableValue :: Ident ( ident. as_ident ( ) ) ,
1604+ ( Err ( _) , other) => self . expected ( "variable value" , other) ?,
1605+ } ;
1606+ Ok ( Statement :: SetVariable {
1607+ local : modifier == Some ( "LOCAL" ) ,
1608+ variable,
1609+ value,
1610+ } )
1611+ } else if variable == "TRANSACTION" && modifier. is_none ( ) {
1612+ Ok ( Statement :: SetTransaction {
1613+ modes : self . parse_transaction_modes ( ) ?,
1614+ } )
1615+ } else {
1616+ self . expected ( "equals sign or TO" , self . peek_token ( ) )
1617+ }
1618+ }
1619+
15961620 pub fn parse_show ( & mut self ) -> Result < Statement , ParserError > {
15971621 if self
15981622 . parse_one_of_keywords ( & [ "EXTENDED" , "FULL" , "COLUMNS" , "FIELDS" ] )
@@ -1601,7 +1625,9 @@ impl Parser {
16011625 self . prev_token ( ) ;
16021626 self . parse_show_columns ( )
16031627 } else {
1604- self . expected ( "EXTENDED, FULL, COLUMNS, or FIELDS" , self . peek_token ( ) )
1628+ Ok ( Statement :: ShowVariable {
1629+ variable : self . parse_identifier ( ) ?,
1630+ } )
16051631 }
16061632 }
16071633
@@ -1973,13 +1999,6 @@ impl Parser {
19731999 } )
19742000 }
19752001
1976- pub fn parse_set_transaction ( & mut self ) -> Result < Statement , ParserError > {
1977- self . expect_keyword ( "TRANSACTION" ) ?;
1978- Ok ( Statement :: SetTransaction {
1979- modes : self . parse_transaction_modes ( ) ?,
1980- } )
1981- }
1982-
19832002 pub fn parse_transaction_modes ( & mut self ) -> Result < Vec < TransactionMode > , ParserError > {
19842003 let mut modes = vec ! [ ] ;
19852004 let mut required = false ;
0 commit comments