@@ -5189,131 +5189,74 @@ impl<'a> Parser<'a> {
51895189 }
51905190
51915191 fn parse_text_search_object_type(&mut self) -> Result<TextSearchObjectType, ParserError> {
5192- match self.expect_one_of_keywords(&[
5193- Keyword::DICTIONARY,
5194- Keyword::CONFIGURATION,
5195- Keyword::TEMPLATE,
5196- Keyword::PARSER,
5197- ])? {
5198- Keyword::DICTIONARY => Ok(TextSearchObjectType::Dictionary),
5199- Keyword::CONFIGURATION => Ok(TextSearchObjectType::Configuration),
5200- Keyword::TEMPLATE => Ok(TextSearchObjectType::Template),
5201- Keyword::PARSER => Ok(TextSearchObjectType::Parser),
5202- // unreachable because expect_one_of_keywords used above
5203- unexpected_keyword => Err(ParserError::ParserError(format!(
5204- "Internal parser error: expected any of {{DICTIONARY, CONFIGURATION, TEMPLATE, PARSER}}, got {unexpected_keyword:?}"
5205- ))),
5206- }
5192+ Ok(if self.parse_keyword(Keyword::DICTIONARY) {
5193+ TextSearchObjectType::Dictionary
5194+ } else if self.parse_keyword(Keyword::CONFIGURATION) {
5195+ TextSearchObjectType::Configuration
5196+ } else if self.parse_keyword(Keyword::TEMPLATE) {
5197+ TextSearchObjectType::Template
5198+ } else if self.parse_keyword(Keyword::PARSER) {
5199+ TextSearchObjectType::Parser
5200+ } else {
5201+ TextSearchObjectType::Custom(self.parse_identifier()?)
5202+ })
52075203 }
52085204
52095205 /// Parse a PostgreSQL `CREATE TEXT SEARCH ...` statement.
52105206 pub fn parse_create_text_search(&mut self) -> Result<CreateTextSearch, ParserError> {
52115207 self.expect_keywords(&[Keyword::TEXT, Keyword::SEARCH])?;
52125208 let object_type = self.parse_text_search_object_type()?;
52135209 let name = self.parse_object_name(false)?;
5214- self.expect_token(&Token::LParen)?;
5215- let options = self.parse_comma_separated(Parser::parse_sql_option)?;
5216- self.expect_token(&Token::RParen)?;
5210+ let options = self
5211+ .parse_parenthesized(|parser| parser.parse_comma_separated(Parser::parse_sql_option))?;
52175212 Ok(CreateTextSearch {
52185213 object_type,
52195214 name,
52205215 options,
52215216 })
52225217 }
52235218
5224- fn parse_alter_text_search_dictionary_option(
5225- &mut self,
5226- ) -> Result<AlterTextSearchDictionaryOption, ParserError> {
5219+ fn parse_alter_text_search_option(&mut self) -> Result<AlterTextSearchOption, ParserError> {
52275220 let key = self.parse_identifier()?;
52285221 let value = if self.consume_token(&Token::Eq) {
52295222 Some(self.parse_expr()?)
52305223 } else {
52315224 None
52325225 };
5233- Ok(AlterTextSearchDictionaryOption { key, value })
5226+ Ok(AlterTextSearchOption { key, value })
5227+ }
5228+
5229+ fn parse_alter_text_search_operation(
5230+ &mut self,
5231+ ) -> Result<AlterTextSearchOperation, ParserError> {
5232+ if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
5233+ Ok(AlterTextSearchOperation::RenameTo {
5234+ new_name: self.parse_identifier()?,
5235+ })
5236+ } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
5237+ Ok(AlterTextSearchOperation::OwnerTo(self.parse_owner()?))
5238+ } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
5239+ Ok(AlterTextSearchOperation::SetSchema {
5240+ schema_name: self.parse_object_name(false)?,
5241+ })
5242+ } else if self.consume_token(&Token::LParen) {
5243+ let options = self.parse_comma_separated(Parser::parse_alter_text_search_option)?;
5244+ self.expect_token(&Token::RParen)?;
5245+ Ok(AlterTextSearchOperation::SetOptions { options })
5246+ } else {
5247+ self.expected_ref(
5248+ "RENAME TO, OWNER TO, SET SCHEMA, or (...)",
5249+ self.peek_token_ref(),
5250+ )
5251+ }
52345252 }
52355253
52365254 /// Parse a PostgreSQL `ALTER TEXT SEARCH ...` statement.
52375255 pub fn parse_alter_text_search(&mut self) -> Result<AlterTextSearch, ParserError> {
52385256 self.expect_keywords(&[Keyword::TEXT, Keyword::SEARCH])?;
52395257 let object_type = self.parse_text_search_object_type()?;
52405258 let name = self.parse_object_name(false)?;
5241-
5242- let operation = match object_type {
5243- TextSearchObjectType::Dictionary => {
5244- if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
5245- AlterTextSearchOperation::RenameTo {
5246- new_name: self.parse_identifier()?,
5247- }
5248- } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
5249- AlterTextSearchOperation::OwnerTo(self.parse_owner()?)
5250- } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
5251- AlterTextSearchOperation::SetSchema {
5252- schema_name: self.parse_object_name(false)?,
5253- }
5254- } else if self.consume_token(&Token::LParen) {
5255- let options = self
5256- .parse_comma_separated(Parser::parse_alter_text_search_dictionary_option)?;
5257- self.expect_token(&Token::RParen)?;
5258- AlterTextSearchOperation::SetOptions { options }
5259- } else {
5260- return self.expected_ref(
5261- "RENAME TO, OWNER TO, SET SCHEMA, or (...) after ALTER TEXT SEARCH DICTIONARY",
5262- self.peek_token_ref(),
5263- );
5264- }
5265- }
5266- TextSearchObjectType::Configuration => {
5267- if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
5268- AlterTextSearchOperation::RenameTo {
5269- new_name: self.parse_identifier()?,
5270- }
5271- } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
5272- AlterTextSearchOperation::OwnerTo(self.parse_owner()?)
5273- } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
5274- AlterTextSearchOperation::SetSchema {
5275- schema_name: self.parse_object_name(false)?,
5276- }
5277- } else {
5278- return self.expected_ref(
5279- "RENAME TO, OWNER TO, or SET SCHEMA after ALTER TEXT SEARCH CONFIGURATION",
5280- self.peek_token_ref(),
5281- );
5282- }
5283- }
5284- TextSearchObjectType::Template => {
5285- if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
5286- AlterTextSearchOperation::RenameTo {
5287- new_name: self.parse_identifier()?,
5288- }
5289- } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
5290- AlterTextSearchOperation::SetSchema {
5291- schema_name: self.parse_object_name(false)?,
5292- }
5293- } else {
5294- return self.expected_ref(
5295- "RENAME TO or SET SCHEMA after ALTER TEXT SEARCH TEMPLATE",
5296- self.peek_token_ref(),
5297- );
5298- }
5299- }
5300- TextSearchObjectType::Parser => {
5301- if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
5302- AlterTextSearchOperation::RenameTo {
5303- new_name: self.parse_identifier()?,
5304- }
5305- } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
5306- AlterTextSearchOperation::SetSchema {
5307- schema_name: self.parse_object_name(false)?,
5308- }
5309- } else {
5310- return self.expected_ref(
5311- "RENAME TO or SET SCHEMA after ALTER TEXT SEARCH PARSER",
5312- self.peek_token_ref(),
5313- );
5314- }
5315- }
5316- };
5259+ let operation = self.parse_alter_text_search_operation()?;
53175260
53185261 Ok(AlterTextSearch {
53195262 object_type,
0 commit comments