@@ -125,8 +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 ( ) ?) ,
129+ "SHOW" => Ok ( self . parse_show ( ) ?) ,
128130 "START" => Ok ( self . parse_start_transaction ( ) ?) ,
129- "SET" => Ok ( self . parse_set_transaction ( ) ?) ,
130131 // `BEGIN` is a nonstandard but common alias for the
131132 // standard `START TRANSACTION` statement. It is supported
132133 // by at least PostgreSQL and MySQL.
@@ -763,7 +764,11 @@ impl Parser {
763764 #[ must_use]
764765 pub fn parse_one_of_keywords ( & mut self , keywords : & [ & ' static str ] ) -> Option < & ' static str > {
765766 for keyword in keywords {
766- assert ! ( keywords:: ALL_KEYWORDS . contains( keyword) ) ;
767+ assert ! (
768+ keywords:: ALL_KEYWORDS . contains( keyword) ,
769+ "{} is not contained in keyword list" ,
770+ keyword
771+ ) ;
767772 }
768773 match self . peek_token ( ) {
769774 Some ( Token :: Word ( ref k) ) => keywords
@@ -1597,6 +1602,74 @@ impl Parser {
15971602 } )
15981603 }
15991604
1605+ pub fn parse_set ( & mut self ) -> Result < Statement , ParserError > {
1606+ let modifier = self . parse_one_of_keywords ( & [ "SESSION" , "LOCAL" ] ) ;
1607+ let variable = self . parse_identifier ( ) ?;
1608+ if self . consume_token ( & Token :: Eq ) || self . parse_keyword ( "TO" ) {
1609+ let token = self . peek_token ( ) ;
1610+ let value = match ( self . parse_value ( ) , token) {
1611+ ( Ok ( value) , _) => SetVariableValue :: Literal ( value) ,
1612+ ( Err ( _) , Some ( Token :: Word ( ident) ) ) => SetVariableValue :: Ident ( ident. as_ident ( ) ) ,
1613+ ( Err ( _) , other) => self . expected ( "variable value" , other) ?,
1614+ } ;
1615+ Ok ( Statement :: SetVariable {
1616+ local : modifier == Some ( "LOCAL" ) ,
1617+ variable,
1618+ value,
1619+ } )
1620+ } else if variable == "TRANSACTION" && modifier. is_none ( ) {
1621+ Ok ( Statement :: SetTransaction {
1622+ modes : self . parse_transaction_modes ( ) ?,
1623+ } )
1624+ } else {
1625+ self . expected ( "equals sign or TO" , self . peek_token ( ) )
1626+ }
1627+ }
1628+
1629+ pub fn parse_show ( & mut self ) -> Result < Statement , ParserError > {
1630+ if self
1631+ . parse_one_of_keywords ( & [ "EXTENDED" , "FULL" , "COLUMNS" , "FIELDS" ] )
1632+ . is_some ( )
1633+ {
1634+ self . prev_token ( ) ;
1635+ self . parse_show_columns ( )
1636+ } else {
1637+ Ok ( Statement :: ShowVariable {
1638+ variable : self . parse_identifier ( ) ?,
1639+ } )
1640+ }
1641+ }
1642+
1643+ fn parse_show_columns ( & mut self ) -> Result < Statement , ParserError > {
1644+ let extended = self . parse_keyword ( "EXTENDED" ) ;
1645+ let full = self . parse_keyword ( "FULL" ) ;
1646+ self . expect_one_of_keywords ( & [ "COLUMNS" , "FIELDS" ] ) ?;
1647+ self . expect_one_of_keywords ( & [ "FROM" , "IN" ] ) ?;
1648+ let table_name = self . parse_object_name ( ) ?;
1649+ // MySQL also supports FROM <database> here. In other words, MySQL
1650+ // allows both FROM <table> FROM <database> and FROM <database>.<table>,
1651+ // while we only support the latter for now.
1652+ let filter = self . parse_show_statement_filter ( ) ?;
1653+ Ok ( Statement :: ShowColumns {
1654+ extended,
1655+ full,
1656+ table_name,
1657+ filter,
1658+ } )
1659+ }
1660+
1661+ fn parse_show_statement_filter ( & mut self ) -> Result < Option < ShowStatementFilter > , ParserError > {
1662+ if self . parse_keyword ( "LIKE" ) {
1663+ Ok ( Some ( ShowStatementFilter :: Like (
1664+ self . parse_literal_string ( ) ?,
1665+ ) ) )
1666+ } else if self . parse_keyword ( "WHERE" ) {
1667+ Ok ( Some ( ShowStatementFilter :: Where ( self . parse_expr ( ) ?) ) )
1668+ } else {
1669+ Ok ( None )
1670+ }
1671+ }
1672+
16001673 pub fn parse_table_and_joins ( & mut self ) -> Result < TableWithJoins , ParserError > {
16011674 let relation = self . parse_table_factor ( ) ?;
16021675
@@ -1932,13 +2005,6 @@ impl Parser {
19322005 } )
19332006 }
19342007
1935- pub fn parse_set_transaction ( & mut self ) -> Result < Statement , ParserError > {
1936- self . expect_keyword ( "TRANSACTION" ) ?;
1937- Ok ( Statement :: SetTransaction {
1938- modes : self . parse_transaction_modes ( ) ?,
1939- } )
1940- }
1941-
19422008 pub fn parse_transaction_modes ( & mut self ) -> Result < Vec < TransactionMode > , ParserError > {
19432009 let mut modes = vec ! [ ] ;
19442010 let mut required = false ;
0 commit comments