Skip to content

Commit 0b74460

Browse files
committed
Code review fixes
1 parent 8d0cb49 commit 0b74460

File tree

4 files changed

+48
-11
lines changed

4 files changed

+48
-11
lines changed

src/ast/mod.rs

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1125,13 +1125,7 @@ pub enum Expr {
11251125
/// [DuckDb](https://duckdb.org/docs/sql/functions/lambda.html)
11261126
Lambda(LambdaFunction),
11271127
/// Checks membership of a value in a JSON array
1128-
///
1129-
/// Syntax:
1130-
/// ```sql
1131-
/// <value> MEMBER OF(<array>)
1132-
/// ```
1133-
/// [MySQL](https://dev.mysql.com/doc/refman/8.4/en/json-search-functions.html#operator_member-of)
1134-
MemberOf(Box<Expr>, Box<Expr>),
1128+
MemberOf(MemberOf),
11351129
}
11361130

11371131
impl Expr {
@@ -1920,7 +1914,7 @@ impl fmt::Display for Expr {
19201914
}
19211915
Expr::Prior(expr) => write!(f, "PRIOR {expr}"),
19221916
Expr::Lambda(lambda) => write!(f, "{lambda}"),
1923-
Expr::MemberOf(value, array) => write!(f, "{value} MEMBER OF({array})"),
1917+
Expr::MemberOf(member_of) => write!(f, "{member_of}"),
19241918
}
19251919
}
19261920
}
@@ -9840,6 +9834,27 @@ impl fmt::Display for NullInclusion {
98409834
}
98419835
}
98429836

9837+
/// Checks membership of a value in a JSON array
9838+
///
9839+
/// Syntax:
9840+
/// ```sql
9841+
/// <value> MEMBER OF(<array>)
9842+
/// ```
9843+
/// [MySQL](https://dev.mysql.com/doc/refman/8.4/en/json-search-functions.html#operator_member-of)
9844+
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
9845+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
9846+
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
9847+
pub struct MemberOf {
9848+
pub value: Box<Expr>,
9849+
pub array: Box<Expr>,
9850+
}
9851+
9852+
impl fmt::Display for MemberOf {
9853+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
9854+
write!(f, "{} MEMBER OF({})", self.value, self.array)
9855+
}
9856+
}
9857+
98439858
#[cfg(test)]
98449859
mod tests {
98459860
use crate::tokenizer::Location;

src/ast/spans.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1619,7 +1619,7 @@ impl Spanned for Expr {
16191619
Expr::OuterJoin(expr) => expr.span(),
16201620
Expr::Prior(expr) => expr.span(),
16211621
Expr::Lambda(_) => Span::empty(),
1622-
Expr::MemberOf(value, array) => value.span().union(&array.span()),
1622+
Expr::MemberOf(member_of) => member_of.value.span().union(&member_of.array.span()),
16231623
}
16241624
}
16251625
}

src/parser/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3614,7 +3614,10 @@ impl<'a> Parser<'a> {
36143614
let _ = self.expect_token(&Token::LParen);
36153615
let expr2 = self.parse_expr()?;
36163616
let _ = self.expect_token(&Token::RParen);
3617-
Ok(Expr::MemberOf(Box::new(expr), Box::new(expr2)))
3617+
Ok(Expr::MemberOf(MemberOf {
3618+
value: Box::new(expr),
3619+
array: Box::new(expr2),
3620+
}))
36183621
} else {
36193622
self.expected("OF after MEMBER", self.peek_token())
36203623
}

tests/sqlparser_mysql.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4113,5 +4113,24 @@ fn parse_alter_table_drop_index() {
41134113
#[test]
41144114
fn parse_json_member_of() {
41154115
mysql().verified_stmt(r#"SELECT 17 MEMBER OF('[23, "abc", 17, "ab", 10]')"#);
4116-
mysql().verified_stmt(r#"SELECT 'ab' MEMBER OF('[23, "abc", 17, "ab", 10]')"#);
4116+
let sql = r#"SELECT 'ab' MEMBER OF('[23, "abc", 17, "ab", 10]')"#;
4117+
let stmt = mysql().verified_stmt(sql);
4118+
match stmt {
4119+
Statement::Query(query) => {
4120+
let select = query.body.as_select().unwrap();
4121+
assert_eq!(
4122+
select.projection,
4123+
vec![SelectItem::UnnamedExpr(Expr::MemberOf(MemberOf {
4124+
value: Box::new(Expr::Value(
4125+
Value::SingleQuotedString("ab".to_string()).into()
4126+
)),
4127+
array: Box::new(Expr::Value(
4128+
Value::SingleQuotedString(r#"[23, "abc", 17, "ab", 10]"#.to_string())
4129+
.into()
4130+
)),
4131+
}))]
4132+
);
4133+
}
4134+
_ => panic!("Unexpected statement {stmt}"),
4135+
}
41174136
}

0 commit comments

Comments
 (0)