Skip to content

Commit fddcfae

Browse files
PostgreSQL: Share operator-purpose parsing
1 parent 72ce6a8 commit fddcfae

2 files changed

Lines changed: 51 additions & 27 deletions

File tree

‎src/parser/mod.rs‎

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8040,20 +8040,7 @@ impl<'a> Parser<'a> {
80408040
None
80418041
};
80428042

8043-
// Optional purpose
8044-
let purpose = if self.parse_keyword(Keyword::FOR) {
8045-
if self.parse_keyword(Keyword::SEARCH) {
8046-
Some(OperatorPurpose::ForSearch)
8047-
} else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
8048-
let sort_family = self.parse_object_name(false)?;
8049-
Some(OperatorPurpose::ForOrderBy { sort_family })
8050-
} else {
8051-
return self
8052-
.expected_ref("SEARCH or ORDER BY after FOR", self.peek_token_ref());
8053-
}
8054-
} else {
8055-
None
8056-
};
8043+
let purpose = self.parse_operator_purpose()?;
80578044

80588045
items.push(OperatorClassItem::Operator {
80598046
strategy_number,
@@ -12298,6 +12285,21 @@ impl<'a> Parser<'a> {
1229812285
})
1229912286
}
1230012287

12288+
fn parse_operator_purpose(&mut self) -> Result<Option<OperatorPurpose>, ParserError> {
12289+
if !self.parse_keyword(Keyword::FOR) {
12290+
return Ok(None);
12291+
}
12292+
12293+
if self.parse_keyword(Keyword::SEARCH) {
12294+
Ok(Some(OperatorPurpose::ForSearch))
12295+
} else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
12296+
let sort_family = self.parse_object_name(false)?;
12297+
Ok(Some(OperatorPurpose::ForOrderBy { sort_family }))
12298+
} else {
12299+
self.expected_ref("SEARCH or ORDER BY after FOR", self.peek_token_ref())
12300+
}
12301+
}
12302+
1230112303
/// Parse an operator item for ALTER OPERATOR FAMILY ADD operations
1230212304
fn parse_operator_family_add_operator(&mut self) -> Result<OperatorFamilyItem, ParserError> {
1230312305
let strategy_number = self.parse_literal_uint()?;
@@ -12308,19 +12310,7 @@ impl<'a> Parser<'a> {
1230812310
let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
1230912311
self.expect_token(&Token::RParen)?;
1231012312

12311-
// Optional purpose
12312-
let purpose = if self.parse_keyword(Keyword::FOR) {
12313-
if self.parse_keyword(Keyword::SEARCH) {
12314-
Some(OperatorPurpose::ForSearch)
12315-
} else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
12316-
let sort_family = self.parse_object_name(false)?;
12317-
Some(OperatorPurpose::ForOrderBy { sort_family })
12318-
} else {
12319-
return self.expected_ref("SEARCH or ORDER BY after FOR", self.peek_token_ref());
12320-
}
12321-
} else {
12322-
None
12323-
};
12313+
let purpose = self.parse_operator_purpose()?;
1232412314

1232512315
Ok(OperatorFamilyItem::Operator {
1232612316
strategy_number,

‎tests/sqlparser_postgres.rs‎

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11026,3 +11026,37 @@ fn parse_create_foreign_data_wrapper_clause_order() {
1102611026
pg_and_generic().verified_stmt(sql);
1102711027
}
1102811028
}
11029+
11030+
#[test]
11031+
fn parse_alter_operator_family_order_by_followed_by_search() {
11032+
let sql = r#"ALTER OPERATOR FAMILY my_ops USING gist ADD OPERATOR 1 < (INT4, INT4) FOR ORDER BY sort_schema."sort family", OPERATOR 2 > (INT4, INT4) FOR SEARCH"#;
11033+
let Statement::AlterOperatorFamily(AlterOperatorFamily {
11034+
operation: AlterOperatorFamilyOperation::Add { items },
11035+
..
11036+
}) = pg_and_generic().verified_stmt(sql)
11037+
else {
11038+
panic!("Expected ALTER OPERATOR FAMILY");
11039+
};
11040+
assert_eq!(
11041+
items,
11042+
vec![
11043+
OperatorFamilyItem::Operator {
11044+
strategy_number: 1,
11045+
operator_name: ObjectName::from(vec![Ident::new("<")]),
11046+
op_types: vec![DataType::Int4(None), DataType::Int4(None)],
11047+
purpose: Some(OperatorPurpose::ForOrderBy {
11048+
sort_family: ObjectName::from(vec![
11049+
Ident::new("sort_schema"),
11050+
Ident::with_quote('"', "sort family"),
11051+
]),
11052+
}),
11053+
},
11054+
OperatorFamilyItem::Operator {
11055+
strategy_number: 2,
11056+
operator_name: ObjectName::from(vec![Ident::new(">")]),
11057+
op_types: vec![DataType::Int4(None), DataType::Int4(None)],
11058+
purpose: Some(OperatorPurpose::ForSearch),
11059+
},
11060+
]
11061+
);
11062+
}

0 commit comments

Comments
 (0)