From 54b34f2a30b4e1f6736104e6248051180fe3a47f Mon Sep 17 00:00:00 2001 From: slopgobblercobbler Date: Sat, 31 Oct 2026 20:42:22 +0100 Subject: [PATCH] MySQL: Fix REGEXP and RLIKE parsing when pattern is NULL (#2760) --- src/parser/mod.rs | 10 ++++++---- tests/sqlparser_mysql.rs | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 11accc3996..710f6622be 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -4222,9 +4222,8 @@ impl<'a> Parser<'a> { self.prev_token(); let negated = self.parse_keyword(Keyword::NOT); let regexp = self.parse_keyword(Keyword::REGEXP); - let rlike = self.parse_keyword(Keyword::RLIKE); - let null = if !self.in_column_definition_state() { - self.parse_keyword(Keyword::NULL) + let rlike = if !regexp { + self.parse_keyword(Keyword::RLIKE) } else { false }; @@ -4237,7 +4236,10 @@ impl<'a> Parser<'a> { ), regexp, }) - } else if negated && null { + } else if negated + && !self.in_column_definition_state() + && self.parse_keyword(Keyword::NULL) + { Ok(Expr::IsNotNull(Box::new(expr))) } else if self.parse_keyword(Keyword::IN) { self.parse_in(expr, negated, false) diff --git a/tests/sqlparser_mysql.rs b/tests/sqlparser_mysql.rs index d5ba2a9056..c707e82a64 100644 --- a/tests/sqlparser_mysql.rs +++ b/tests/sqlparser_mysql.rs @@ -3491,9 +3491,24 @@ fn parse_rlike_and_regexp() { "SELECT 1 WHERE 'a' REGEXP '^a$'", "SELECT 1 WHERE 'a' NOT RLIKE '^a$'", "SELECT 1 WHERE 'a' NOT REGEXP '^a$'", + "SELECT 'abc' REGEXP NULL", + "SELECT a RLIKE NULL FROM t", + "SELECT a NOT REGEXP NULL OR b FROM t", + "SELECT a NOT RLIKE NULL FROM t", ] { mysql_and_generic().verified_only_select(s); } + + let select = mysql().verified_only_select("SELECT 'abc' REGEXP NULL"); + assert_matches!( + &select.projection[0], + SelectItem::UnnamedExpr(Expr::RLike { + negated: false, + regexp: true, + pattern, + .. + }) if matches!(**pattern, Expr::Value(ValueWithSpan { value: Value::Null, .. })) + ); } #[test]