This is an automated email from the ASF dual-hosted git repository.

tustvold pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git


The following commit(s) were added to refs/heads/master by this push:
     new 6ee30a57e9 fix multiline likes (#4548)
6ee30a57e9 is described below

commit 6ee30a57e9935ddd3fb7828062e3dfbfacf574a4
Author: Remco Verhoef <[email protected]>
AuthorDate: Fri Jul 21 20:51:31 2023 +0200

    fix multiline likes (#4548)
    
    we will ignore new lines in case of more complex likes, which are
    translated to regexes
---
 arrow-string/src/like.rs | 136 +++++++++++++++++++++++++++++++----------------
 1 file changed, 90 insertions(+), 46 deletions(-)

diff --git a/arrow-string/src/like.rs b/arrow-string/src/like.rs
index 6b4aea7e8e..1223280e37 100644
--- a/arrow-string/src/like.rs
+++ b/arrow-string/src/like.rs
@@ -266,7 +266,7 @@ fn like<'a, S: ArrayAccessor<Item = &'a str>>(
     right: S,
 ) -> Result<BooleanArray, ArrowError> {
     regex_like(left, right, false, |re_pattern| {
-        Regex::new(&format!("^{re_pattern}$")).map_err(|e| {
+        Regex::new(&format!("(?s)^{re_pattern}$")).map_err(|e| {
             ArrowError::ComputeError(format!(
                 "Unable to build regex from LIKE pattern: {e}"
             ))
@@ -312,7 +312,7 @@ fn like_scalar_op<'a, F: Fn(bool) -> bool, L: 
ArrayAccessor<Item = &'a str>>(
         }))
     } else {
         let re_pattern = replace_like_wildcards(right)?;
-        let re = Regex::new(&format!("^{re_pattern}$")).map_err(|e| {
+        let re = Regex::new(&format!("(?s)^{re_pattern}$")).map_err(|e| {
             ArrowError::ComputeError(format!(
                 "Unable to build regex from LIKE pattern: {e}"
             ))
@@ -395,7 +395,7 @@ fn nlike<'a, S: ArrayAccessor<Item = &'a str>>(
     right: S,
 ) -> Result<BooleanArray, ArrowError> {
     regex_like(left, right, true, |re_pattern| {
-        Regex::new(&format!("^{re_pattern}$")).map_err(|e| {
+        Regex::new(&format!("(?s)^{re_pattern}$")).map_err(|e| {
             ArrowError::ComputeError(format!(
                 "Unable to build regex from LIKE pattern: {e}"
             ))
@@ -442,7 +442,7 @@ fn ilike<'a, S: ArrayAccessor<Item = &'a str>>(
     right: S,
 ) -> Result<BooleanArray, ArrowError> {
     regex_like(left, right, false, |re_pattern| {
-        Regex::new(&format!("(?i)^{re_pattern}$")).map_err(|e| {
+        Regex::new(&format!("(?is)^{re_pattern}$")).map_err(|e| {
             ArrowError::ComputeError(format!(
                 "Unable to build regex from ILIKE pattern: {e}"
             ))
@@ -487,7 +487,7 @@ fn ilike_scalar_op<O: OffsetSizeTrait, F: Fn(bool) -> bool>(
     }
 
     let re_pattern = replace_like_wildcards(right)?;
-    let re = Regex::new(&format!("(?i)^{re_pattern}$")).map_err(|e| {
+    let re = Regex::new(&format!("(?is)^{re_pattern}$")).map_err(|e| {
         ArrowError::ComputeError(format!("Unable to build regex from ILIKE 
pattern: {e}"))
     })?;
 
@@ -530,7 +530,7 @@ fn nilike<'a, S: ArrayAccessor<Item = &'a str>>(
     right: S,
 ) -> Result<BooleanArray, ArrowError> {
     regex_like(left, right, true, |re_pattern| {
-        Regex::new(&format!("(?i)^{re_pattern}$")).map_err(|e| {
+        Regex::new(&format!("(?is)^{re_pattern}$")).map_err(|e| {
             ArrowError::ComputeError(format!(
                 "Unable to build regex from ILIKE pattern: {e}"
             ))
@@ -1368,6 +1368,7 @@ mod tests {
             Some("Air"),
             None,
             Some("Air"),
+            Some("bbbbb\nAir"),
         ];
 
         let dict_array: DictionaryArray<Int8Type> = data.into_iter().collect();
@@ -1380,7 +1381,8 @@ mod tests {
                 Some(false),
                 Some(true),
                 None,
-                Some(true)
+                Some(true),
+                Some(false),
             ]),
         );
 
@@ -1392,7 +1394,8 @@ mod tests {
                 Some(false),
                 Some(true),
                 None,
-                Some(true)
+                Some(true),
+                Some(false),
             ]),
         );
 
@@ -1404,7 +1407,8 @@ mod tests {
                 Some(true),
                 Some(false),
                 None,
-                Some(false)
+                Some(false),
+                Some(false),
             ]),
         );
 
@@ -1416,7 +1420,8 @@ mod tests {
                 Some(true),
                 Some(false),
                 None,
-                Some(false)
+                Some(false),
+                Some(false),
             ]),
         );
 
@@ -1428,7 +1433,8 @@ mod tests {
                 Some(true),
                 Some(true),
                 None,
-                Some(true)
+                Some(true),
+                Some(true),
             ]),
         );
 
@@ -1440,7 +1446,8 @@ mod tests {
                 Some(true),
                 Some(true),
                 None,
-                Some(true)
+                Some(true),
+                Some(true),
             ]),
         );
 
@@ -1452,7 +1459,8 @@ mod tests {
                 Some(false),
                 Some(true),
                 None,
-                Some(true)
+                Some(true),
+                Some(true),
             ]),
         );
 
@@ -1464,7 +1472,8 @@ mod tests {
                 Some(false),
                 Some(true),
                 None,
-                Some(true)
+                Some(true),
+                Some(true),
             ]),
         );
 
@@ -1476,7 +1485,8 @@ mod tests {
                 Some(true),
                 Some(false),
                 None,
-                Some(false)
+                Some(false),
+                Some(false),
             ]),
         );
 
@@ -1488,7 +1498,8 @@ mod tests {
                 Some(true),
                 Some(false),
                 None,
-                Some(false)
+                Some(false),
+                Some(false),
             ]),
         );
     }
@@ -1502,6 +1513,7 @@ mod tests {
             Some("Air"),
             None,
             Some("Air"),
+            Some("bbbbb\nAir"),
         ];
 
         let dict_array: DictionaryArray<Int8Type> = data.into_iter().collect();
@@ -1514,7 +1526,8 @@ mod tests {
                 Some(true),
                 Some(false),
                 None,
-                Some(false)
+                Some(false),
+                Some(true),
             ]),
         );
 
@@ -1526,7 +1539,8 @@ mod tests {
                 Some(true),
                 Some(false),
                 None,
-                Some(false)
+                Some(false),
+                Some(true),
             ]),
         );
 
@@ -1538,7 +1552,8 @@ mod tests {
                 Some(false),
                 Some(true),
                 None,
-                Some(true)
+                Some(true),
+                Some(true),
             ]),
         );
 
@@ -1550,7 +1565,8 @@ mod tests {
                 Some(false),
                 Some(true),
                 None,
-                Some(true)
+                Some(true),
+                Some(true),
             ]),
         );
 
@@ -1562,7 +1578,8 @@ mod tests {
                 Some(false),
                 Some(false),
                 None,
-                Some(false)
+                Some(false),
+                Some(false),
             ]),
         );
 
@@ -1574,7 +1591,8 @@ mod tests {
                 Some(false),
                 Some(false),
                 None,
-                Some(false)
+                Some(false),
+                Some(false),
             ]),
         );
 
@@ -1586,7 +1604,8 @@ mod tests {
                 Some(true),
                 Some(false),
                 None,
-                Some(false)
+                Some(false),
+                Some(false),
             ]),
         );
 
@@ -1598,7 +1617,8 @@ mod tests {
                 Some(true),
                 Some(false),
                 None,
-                Some(false)
+                Some(false),
+                Some(false),
             ]),
         );
 
@@ -1610,7 +1630,8 @@ mod tests {
                 Some(false),
                 Some(true),
                 None,
-                Some(true)
+                Some(true),
+                Some(true),
             ]),
         );
 
@@ -1622,7 +1643,8 @@ mod tests {
                 Some(false),
                 Some(true),
                 None,
-                Some(true)
+                Some(true),
+                Some(true),
             ]),
         );
     }
@@ -1636,6 +1658,7 @@ mod tests {
             Some("Air"),
             None,
             Some("Air"),
+            Some("bbbbb\nAir"),
         ];
 
         let dict_array: DictionaryArray<Int8Type> = data.into_iter().collect();
@@ -1648,7 +1671,8 @@ mod tests {
                 Some(false),
                 Some(true),
                 None,
-                Some(true)
+                Some(true),
+                Some(false),
             ]),
         );
 
@@ -1660,7 +1684,8 @@ mod tests {
                 Some(false),
                 Some(true),
                 None,
-                Some(true)
+                Some(true),
+                Some(false),
             ]),
         );
 
@@ -1672,7 +1697,8 @@ mod tests {
                 Some(true),
                 Some(false),
                 None,
-                Some(false)
+                Some(false),
+                Some(false),
             ]),
         );
 
@@ -1684,7 +1710,8 @@ mod tests {
                 Some(true),
                 Some(false),
                 None,
-                Some(false)
+                Some(false),
+                Some(false),
             ]),
         );
 
@@ -1696,7 +1723,8 @@ mod tests {
                 Some(true),
                 Some(true),
                 None,
-                Some(true)
+                Some(true),
+                Some(true),
             ]),
         );
 
@@ -1708,7 +1736,8 @@ mod tests {
                 Some(true),
                 Some(true),
                 None,
-                Some(true)
+                Some(true),
+                Some(true),
             ]),
         );
 
@@ -1720,7 +1749,8 @@ mod tests {
                 Some(false),
                 Some(true),
                 None,
-                Some(true)
+                Some(true),
+                Some(true),
             ]),
         );
 
@@ -1732,7 +1762,8 @@ mod tests {
                 Some(false),
                 Some(true),
                 None,
-                Some(true)
+                Some(true),
+                Some(true),
             ]),
         );
 
@@ -1744,7 +1775,8 @@ mod tests {
                 Some(true),
                 Some(true),
                 None,
-                Some(true)
+                Some(true),
+                Some(true),
             ]),
         );
 
@@ -1756,7 +1788,8 @@ mod tests {
                 Some(true),
                 Some(true),
                 None,
-                Some(true)
+                Some(true),
+                Some(true),
             ]),
         );
     }
@@ -1770,6 +1803,7 @@ mod tests {
             Some("Air"),
             None,
             Some("Air"),
+            Some("bbbbb\nAir"),
         ];
 
         let dict_array: DictionaryArray<Int8Type> = data.into_iter().collect();
@@ -1782,7 +1816,8 @@ mod tests {
                 Some(true),
                 Some(false),
                 None,
-                Some(false)
+                Some(false),
+                Some(true),
             ]),
         );
 
@@ -1794,7 +1829,8 @@ mod tests {
                 Some(true),
                 Some(false),
                 None,
-                Some(false)
+                Some(false),
+                Some(true),
             ]),
         );
 
@@ -1806,7 +1842,8 @@ mod tests {
                 Some(false),
                 Some(true),
                 None,
-                Some(true)
+                Some(true),
+                Some(true),
             ]),
         );
 
@@ -1818,7 +1855,8 @@ mod tests {
                 Some(false),
                 Some(true),
                 None,
-                Some(true)
+                Some(true),
+                Some(true),
             ]),
         );
 
@@ -1830,7 +1868,8 @@ mod tests {
                 Some(false),
                 Some(false),
                 None,
-                Some(false)
+                Some(false),
+                Some(false),
             ]),
         );
 
@@ -1842,7 +1881,8 @@ mod tests {
                 Some(false),
                 Some(false),
                 None,
-                Some(false)
+                Some(false),
+                Some(false),
             ]),
         );
 
@@ -1854,7 +1894,8 @@ mod tests {
                 Some(true),
                 Some(false),
                 None,
-                Some(false)
+                Some(false),
+                Some(false),
             ]),
         );
 
@@ -1866,7 +1907,8 @@ mod tests {
                 Some(true),
                 Some(false),
                 None,
-                Some(false)
+                Some(false),
+                Some(false),
             ]),
         );
 
@@ -1878,7 +1920,8 @@ mod tests {
                 Some(false),
                 Some(false),
                 None,
-                Some(false)
+                Some(false),
+                Some(false),
             ]),
         );
 
@@ -1890,7 +1933,8 @@ mod tests {
                 Some(false),
                 Some(false),
                 None,
-                Some(false)
+                Some(false),
+                Some(false),
             ]),
         );
     }

Reply via email to